unsigned int
当我溢出它时会包含什么?具体来说,我想用两个unsigned int
s 做一个乘法:unsigned int
乘法完成后会是什么?
unsigned int someint = 253473829*13482018273;
unsigned int
当我溢出它时会包含什么?具体来说,我想用两个unsigned int
s 做一个乘法:unsigned int
乘法完成后会是什么?
unsigned int someint = 253473829*13482018273;
unsigned
数字不能溢出,而是使用模数的属性环绕。
例如,当unsigned int
是 32 位时,结果将是:(a * b) mod 2^32
.
正如 CharlesBailey 指出的那样,253473829*13482018273
可以在转换之前使用有符号乘法,因此您应该在unsigned
乘法之前明确说明:
unsigned int someint = 253473829U * 13482018273U;
无符号整数溢出与其有符号对应物不同,表现出明确定义的行为。
价值观基本上是“环绕”的。它是安全的,通常用于倒计时或散列/mod 函数。
这可能有点取决于您的编译器。几年前我遇到过类似的错误,有时您会遇到运行时错误,有时它基本上会“包装”回一个非常小的数字,这是由于砍掉最高级别的位并留下剩余部分,即如果它是 32 bit unsigned int,并且您的乘法结果将是一个 34 位数字,它将切断高位 2 位并给您余数。您可能必须在编译器上试一试才能准确查看得到的结果,这可能与使用不同编译器得到的结果不同,特别是如果溢出发生在最终结果在无符号整数的范围。