8
#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",i<<1);
    return 0;
}

为什么这个程序打印 256?

据我了解,由于 0x80= 0b10000000,并且 unsigned char 有 8 位,左移后“1”应该溢出,输出应该是 0,而不是 256。

4

2 回答 2

14

这是 C 的整数提升规则的结果。本质上,大多数进入表达式的变量都是“提升”的,这样这样的操作就不会失去精度。然后,根据 C 的变量参数规则,它作为intinto传递。printf

如果你想要你正在寻找的东西,你必须回溯到unsigned char

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",((unsigned char)(i<<1)));
    return 0;
}

注意:使用%c斯蒂芬评论中指定的方法将不起作用,因为%c也需要一个整数。

编辑:或者,你可以这样做:

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    unsigned char res = i<<1;
    printf("%d",res);
    return 0;
}

或者

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",(i<<1) & 0xFF);
    return 0;
}
于 2010-07-30T16:51:49.087 回答
0

不要忘记专门用于打印未签名的格式。

printf("%u",(unsigned char)(i<<1));
于 2010-07-30T17:30:25.967 回答