当我溢出时unsigned int
包含什么?具体来说,我想用两个unsigned int
进行乘法运算:乘法结束后unsigned int
中的内容会是什么?
unsigned int someint = 253473829*13482018273;
答案 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位并给出余数。你可能不得不在你的编译器上试一试,看看你得到了什么,这可能与你使用不同的编译器不一样,特别是如果溢出发生在表达式的中间,其中最终结果在无符号整数的范围。