:) 您好,
我长期以来一直在摸不着头脑。我只是想把4294967296添加到我的负int(-432到+431)我有这个
int temp_int;
temp_int = ui->SpawnX->value(); //From spinbox
if(temp_int < 0)
{
temp_int = temp_int + 4294967296;
qDebug() << temp_int;
}
但无论我尝试什么,temp_int都保持不变,我再次检查qDebug。我做错了什么!!!?
我的课程早期:
//Get spawn point and fix negative numbers
temp_hex = level.mid(18+level.indexOf("030006537061776e58"), 8);
HexToInt(temp_hex, SpawnX);
temp_hex = level.mid(18+level.indexOf("030006537061776e59"), 8);
HexToInt(temp_hex, SpawnY);
temp_hex = level.mid(18+level.indexOf("030006537061776e5a"), 8);
HexToInt(temp_hex, SpawnZ);
if(SpawnX > 432)
SpawnX = SpawnX-4294967296;
if(SpawnY > 432)
SpawnY = SpawnY-4294967296;
if(SpawnZ > 432)
SpawnZ = SpawnZ-4294967296;
在这种情况下,SpawnX,Y,Z为int,范围为0到4294967295.
答案 0 :(得分:1)
您好像假设将-492添加4294967296会给您+431。
这不正确(我想知道你是如何做出这个假设的。)
4294967296是2 32 。将2 32 添加到32位int
将可能只是环绕并为您提供原始值。实际上有符号整数溢出具有未定义的行为,但是通用实现只忽略除了低位32位之外的所有 - 并且4294967296的所有低位32位都是0.它在十六进制中更清楚:4294967296是0x100000000,并且丢弃了第33位bit给你0x00000000。
如果你有-432并且想要+431,那么有多种方法可以做到;最简单的可能只是
temp_int = -temp_int - 1;
更简单的方法是:
temp_int = 431;
但这可能不是你想要的。
如果我们理解你要做的事情会有所帮助。
在这种情况下,SpawnX,Y,Z为int,范围为0到4294967295.
如果您需要该范围,则需要使用32位无符号类型。如果unsigned int
是32位,则它可以表示0到4294967295之间的值。在这种情况下,添加4294967296 将环绕并为您提供原始值;无符号溢出,与有符号溢出不同,定义良好。