int的奇怪属性

时间:2018-02-21 03:08:51

标签: javascript java c

在他的一次演讲中,道格拉斯·克罗克福德说,他有一些奇怪的属性,他继续说, 可以具有两个整数a和b,使得a> 1。 0,b> 0

c = a + b

我们最终可能会得到c< a或b<一个。 有人可以用一个例子解释这个。

这是他演讲的截图。 enter image description here

2 个答案:

答案 0 :(得分:2)

中,有一种情况会导致这种行为。(例如:有符号整数加法等)有符号整数溢出是未定义的行为。如果结果不是表达式类型的可表示值,则对表达式的求值会产生未定义的行为。在许多机器上,未定义的行为证明是事实 - 它会使c为负(在签名加法的上下文中讨论)。这是有符号整数溢出。一个例子必须是

int a = INT_MAX;
int b = INT_MAX;
int c = a + b; //<--- overflow.

进一步深入研究很明显,在的情况下,溢出行为被固定为该类型的最大值。所以你展示的场景很可能不是

溢出时,它会回到最小值并从那里开始。对于下溢,同样的情况发生但只达到最大值然后从那里开始。

答案 1 :(得分:1)

可能因为无法正确处理附加操作中的溢出条件。 在系统中说int占用2个字节的空间。 所以支持的范围是-32768到+32767或0到65535

a=65534,b=4; 
c=a+b;
c=3.

b=65534,a=4; 
c=a+b;
c=3.