溢出的无符号整数

时间:2012-02-08 13:06:16

标签: c++ integer-overflow unsigned-integer

当我溢出时unsigned int包含什么?具体来说,我想用两个unsigned int进行乘法运算:乘法结束后unsigned int中的内容会是什么?

unsigned int someint = 253473829*13482018273;

3 个答案:

答案 0 :(得分:24)

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

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


正如CharlesBailey指出的那样,253473829*13482018273在转换之前可能会使用带符号的乘法,因此在乘法之前你应该明确unsigned

unsigned int someint = 253473829U * 13482018273U;

答案 1 :(得分:6)

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

值基本上“包裹”。它是安全的,通常用于倒计时或哈希/ mod函数。

答案 2 :(得分:-3)

这可能取决于你的编译器。我有像今年这样的错误,有时你会得到运行时错误,有时候它会基本上“换行”回到一个非常小的数字,这个数字会因为切断最高级别的位而留下余数,即如果它是32位无符号整数,并且乘法的结果将是一个34位数,它会切断高位2位并给出余数。你可能不得不在你的编译器上试一试,看看你得到了什么,这可能与你使用不同的编译器不一样,特别是如果溢出发生在表达式的中间,其中最终结果在无符号整数的范围。