有符号和无符号数据类型之间的区别?

pfl*_*flz 6 c unsigned

main()
{
    char i=255;
    printf("\n%x\n",i);
}
Run Code Online (Sandbox Code Playgroud)

输出:ffffffff

main()
{
    u_char i=255;
    printf("\n%x\n",i);
}
Run Code Online (Sandbox Code Playgroud)

输出:ff

这里发生了什么?请通过一些好的链接向我解释输出.这是我猜的一个非常基本的事情,我真的很困惑......

Oli*_*rth 10

你在这里看到的是两件事:

  • 255不符合范围char(请注意,它是实现定义的,是否char等同于signed charunsigned char,但显然在您的平台上signed char).结果行为是实现定义的,但通常它将换行并变为-1; 看两个补码.
  • 整数提升,因为printf()是一个变量参数函数.积分型参数(如char)会自动提升为int.

因此,printf()看到int一个值为-1,并相应地打印其十六进制表示.

对于这种unsigned情况,没有环绕. printf()看到int一个值为的值255,并相应地打印其十六进制表示(省略前导零).

  • @Naman:它正在升级,因为这是C标准所说的应该发生的事情.当我说"两个补码"时,我指的是"二进制补码算术",而不是"两个补码". (2认同)