在C语言中将有符号字符转换为无符号整数

5

有人能为我解释一下,为什么以下代码输出-50,尽管它被转换为无符号整数?

int main()
{
  signed char byte = -50;
  unsigned int n;

  n = (unsigned int) byte;

  printf("n: %d", n);
}

输出:-50


1
%d 替换为 %u 以表示无符号整数。 - Zied R.
4个回答

6
给无符号整数赋值为-50会导致整数回绕,而这个回绕的无符号整数具有与以补码表示的相应有符号整数(对于几乎所有计算机都使用)-50相同的位集。
现在,printf是一个带有可变参数的函数,它根据格式字符串进行解释。格式%d用于有符号int,printf无法知道相应的参数实际上是无符号整数(因为你告诉它不是),所以位被解释为有符号整数,你得到了-50。

5
演员选择正确,但你的打印方式不对。printf()中的%d是用于int类型的,请改为:
printf("n: %u", n);

谢谢,现在我感觉很蠢 :P 没有意识到那个。我已经习惯了使用Java和C#工作,忘记了很多c语法。 - Kyle Rohlfing
这不是正确的答案!printf将显示4294967246。 - Bobax

2

1

根据您的声明:

printf("n: %d", n); 

你正在将其转换为“有符号十进制整数”
如果你尝试
std::cout<<n<<std::endl;

你会发现你不会得到-50

那是C++,但问题标记为C。 - Yu Hao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接