以下是使用具有相应输出的unsigned int
的不同程序/方案。我不知道为什么有些人没有按预期工作。
预期产出:2
计划1 :
int main()
{
int value = -2;
std::cout << (unsigned int)value;
return 0;
}
// OUTPUT: 4294967294
计划2 :
int main()
{
int value;
value = -2;
std::cout << (unsigned int)value;
return 0;
}
// OUTPUT: 4294967294
计划3 :
int main()
{
int value;
std::cin >> value; // 2
std::cout << (unsigned int)value;
return 0;
}
// OUTPUT: 2
有人可以解释为什么计划1和计划2不起作用吗?对不起,我是编码新手。
答案 0 :(得分:2)
您期望从int
到unsigned int
的演员表只需更改负值的符号,同时保持其幅度。但这不是它在C或C ++中的工作方式。当涉及到溢出时,无符号整数遵循模运算,这意味着从负数值(例如-1或-2)分配或初始化包围最大和第二大无符号值,依此类推。因此,例如,这两个是等价的:
unsigned int n = -1;
unsigned int m = -2;
和
unsigned int n = std::numeric_limits<unsigned int>::max();
unsigned int m = std::numeric_limits<unsigned int>::max() - 1;
另请注意,程序1和2之间没有实质性区别。这一切都是用于初始化或分配给无符号整数的值的符号。
答案 1 :(得分:0)
将值从有符号转换为无符号会更改如何解释值的单个位。让我们看一个像char
和unsigned char
这样的8位值的简单示例。
字符值的值范围为-128到127.包括0这些值是256(2 ^ 8)个值。通常第一位表示该值为负或正。因此,只有最后7位可用于描述实际值。
无符号字符不能取任何负值,因为没有位可以确定该值应为负值还是正值。因此,其值范围为0到256.
当所有位都置位(1111 1111
)时,无符号字符的值为256.但是,简单字符值会将第一位视为负值的指示符。坚持two's complement此值将为-1。
这就是int
到unsigned int
的演员阵容不符合您的预期,但它完全符合预期。
修改强>
如果您只想从负值切换为正值,请自行编写一个类似
的简单函数uint32_t makeUnsigned(int32_t toCast)
{
if (toCast < 0)
toCast *= -1;
return static_cast<uint32_t>(toCast);
}
这样您就可以将传入的int
转换为unsigned int
,其最大值为2^32 - 1