在C/C++中允许有符号整数溢出

Hen*_* B. 7 c c++ integer-overflow

希望签名整数在它们变得太大时溢出.如何在不使用下一个最大数据类型的情况下(或者当我已经在int128_t时)实现这一目标?

例如,使用8位整数19*12通常是260,但我希望结果1 11 10 01 00第9位被截止,因此-27.

Pas*_*uoq 6

签名溢出在C中是未定义的,这是真实的.

一个解决方案如下

signed_result = (unsigned int)one_argument + (unsigned int)other_argument;
Run Code Online (Sandbox Code Playgroud)

上述方案包括实现定义从最终转化unsignedint,但不调用未定义的行为.对于大多数编译平台的实现定义选择,结果正是您期望的两个补码结果.

最后,针对实现定义的选择迫使编译器为您提供所期望的行为的众多平台之一的优化编译器将上述代码编译为明显的汇编指令.

或者,如果您使用的是gcc,则选项-fwrapv/ -fno-strict-overflow可能正是您想要的.它们提供了有关签名溢出的标准的额外保证.我不确定两者之间的区别.


Bil*_*eal 2

根据 C 和 C++ 标准,有符号整数溢出是未定义的。如果没有考虑到特定的平台,就无法实现您想要的目标。