19

unsigned int当我溢出它时会包含什么?具体来说,我想用两个unsigned ints 做一个乘法:unsigned int乘法完成后会是什么?

unsigned int someint = 253473829*13482018273;
4

3 回答 3

26

unsigned数字不能溢出,而是使用模数的属性环绕。

例如,当unsigned int是 32 位时,结果将是:(a * b) mod 2^32.


正如 CharlesBailey 指出的那样,253473829*13482018273可以在转换之前使用有符号乘法,因此您应该在unsigned乘法之前明确说明:

unsigned int someint = 253473829U * 13482018273U;
于 2012-02-08T13:14:34.913 回答
7

无符号整数溢出与其有符号对应物不同,表现出明确定义的行为。

价值观基本上是“环绕”的。它是安全的,通常用于倒计时或散列/mod 函数。

于 2012-02-08T13:17:10.263 回答
-3

这可能有点取决于您的编译器。几年前我遇到过类似的错误,有时您会遇到运行时错误,有时它基本上会“包装”回一个非常小的数字,这是由于砍掉最高级别的位并留下剩余部分,即如果它是 32 bit unsigned int,并且您的乘法结果将是一个 34 位数字,它将切断高位 2 位并给您余数。您可能必须在编译器上试一试才能准确查看得到的结果,这可能与使用不同编译器得到的结果不同,特别是如果溢出发生在最终结果在无符号整数的范围。

于 2012-02-08T13:22:29.803 回答