谁能向我解释为什么以下代码输出 -50,即使它被强制转换为无符号的 int?
int main()
{
signed char byte = -50;
unsigned int n;
n = (unsigned int) byte;
printf("n: %d", n);
}
输出: -50
将-50
分配给unsigned int
会导致整数环绕,并且这种环绕unsigned int
具有与几乎每台计算机使用的二进制补码表示中对应于-50
的signed int
相同的位。
现在,printf
是一个具有可变参数数量的函数,它根据格式字符串进行解释。%d
的格式是用于有符号的int
,printf
无法知道相应的参数实际上是unsigned int
(因为你另有说明)。所以这些位被解释为好像它是signed int
的,你会得到-50
.
强制转换正确,但打印不正确。 %d
printf()
表示int
,请将其更改为:
printf("n: %u", n);
即使有printf("n: %u", n);
,你也不会得到50
。
查看链接int to unsigned int conversion
用你的陈述:
printf("n: %d", n);
您将其转换为"有符号十进制整数"
如果你尝试
std::cout<<n<<std::endl;
你会看到你不会得到-50