有人可以向我解释为什么以下代码输出-50,即使它被转换为unsigned int吗?
int main()
{
signed char byte = -50;
unsigned int n;
n = (unsigned int) byte;
printf("n: %d", n);
}
输出:-50
答案 0 :(得分:5)
演员表是正确的,但您打印错误。 %d
中的printf()
用于int
,请将其更改为:
printf("n: %u", n);
答案 1 :(得分:4)
将-50
分配给unsigned int
会导致整数回绕,并且unsigned int
包含的内容与signed int
对应的-50
具有相同的位在几乎所有计算机都使用的二进制补码表示中。
现在,printf
是一个函数,它根据格式字符串解释可变数量的参数。格式%d
适用于签名 int
,而printf
无法知道相应的参数实际上是unsigned int
(因为你告诉了)否则)。因此,这些位被解释为signed int
并且得到-50
。
答案 2 :(得分:1)
发表声明:
printf("n: %d", n);
您将其转换为“有符号十进制整数”
如果你尝试
std::cout<<n<<std::endl;
你会发现你不会得到 -50
答案 3 :(得分:0)
即使使用printf("n: %u", n);
,您也不会获得50
。