2015-04-20 17 views
2

我已经在Turbo C/C++编辑器的32位Windows 7操作系统上执行此程序。即使值越过其范围,整型变量如何显示正确的值?

#include<stdio.h> 
#include<conio.h> 

void main() 
{ 
    int a,b,c,d,e; 
    clrscr(); 

    a = 25000; 
    b = 10000; 

    c = a + b; 

    printf(" The value of c = %d\n", c); 

    d = 5000; 

    e = c - d; 

    printf(" The value of e is %d\n", e); 

    getch(); 
} 

当我打印c时,得到值-30536,因为值35000超过最大值。但是当我在表达式'e = c - d;'中使用相同的c时,我得到正确的值为30000. 这怎么可能?

+0

'-30536 - 5000 = 30000' –

+0

您如何证明该解决方案? –

+0

大卫..请详细说明您的答案...如何可以-30536 - 5000等于30000? –

回答

4

让我们踢小数点和我们的大脑,并使用二进制和CPU。 的int是这里的16位

表达25000 + 10000(添加的二进制代码非常简单)

01100001 10101000 = 25000 
+00100111 00010000 = 10000 
10001000 10111000 = -30536 

10001000 10111000是其结果作为第一个位是有符号的位,它是负30536现在

表达-30536 - 5000(-30536 +(-5000))

10001000 10111000 = -30536 
+11101100 01111000 = -5000 
01110101 00110000 = 30000 

01110101 00110000这个结果是肯定的30000

或-30536-5000你可以使用2的补码方法来减去。我不会在这里解释。

+3

这两个表达式都应该是main-return-in-c-and-c?lq = 1)是具有16位有符号整数的UB。当然你需要提到这一点。或提问者会认为这可以依靠。 –

+0

@DavidHeffernan在您发表评论之前,我正在编辑此内容。不管怎么说谢谢 –

+0

非常感谢你Inder,David和大家...... –