当我溢出unsigned int
时,它会包含什么?具体而言,我想使用两个unsigned int
进行乘法运算:在乘法完成后,unsigned int
中会有什么?
unsigned int someint = 253473829*13482018273;
当我溢出unsigned int
时,它会包含什么?具体而言,我想使用两个unsigned int
进行乘法运算:在乘法完成后,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;
253473829*13482018273
可能使用有符号整数算术,在结果转换为 unsigned int
之前可能会溢出。 - CB Bailey无符号整数溢出与其有符号对应相比,表现出良好的行为。
值基本上会“环绕”回来。它通常用于倒计数、哈希/模函数中,非常安全且常用。
这可能有点取决于你的编译器。我多年前就遇到了这样的错误,有时你会得到运行时错误,其他时候它会基本上“回卷”到一个非常小的数字,这是由于截去最高位比特并留下余数造成的。例如,如果它是32位无符号整数,而您的乘法结果将是34位数字,则会截去高阶2位并给您余数。您可能需要在您的编译器上尝试一下才能确定具体情况,这可能与使用不同编译器时得到的情况不同,特别是如果溢出发生在表达式的中间,而最终结果在无符号整数范围内。
UINT_MAX + 5
会回滚并变成4。 - Some programmer dude