关于无符号整数下溢的C行为的问题

sna*_*nap 18 c types integer integer-overflow underflow

我已经在很多地方读过,整数溢出在C中定义得很好,与签名对应物不同.

下溢是一样的吗?

例如:

unsigned int x = -1; // Does x == UINT_MAX?
Run Code Online (Sandbox Code Playgroud)

谢谢.

我不记得在哪里,但我在某处读到无符号整数类型的算术是模块化的,所以如果是这种情况那么-1 == UINT_MAX mod(UINT_MAX + 1).

Ste*_*non 23

§6.2.5,第9段:

涉及无符号操作数的计算永远不会溢出,因为无法通过生成的无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模.

编辑:

对不起,错误的引用,但结果仍然是固定的.正确的引用是§6.3.1.3(有符号和无符号整数转换):

如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.

是的,x == UINT_MAX.

  • 对于正确答案+1,§6.3.1.3似乎是一种非常扭曲的方式,要求`(unsigned int)( - 1)== UINT_MAX`而不一定要求使用带符号的数字来使用二进制补码. (3认同)