无符号字符的最大值

时间:2010-07-30 16:38:06

标签: c bit-manipulation unsigned-char

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

为什么这个程序打印256?

据我所知,由于0x80 = 0b10000000,无符号字符有8位,因此左移后'1'应溢出,输出应为0,而不是256。

2 个答案:

答案 0 :(得分:14)

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

如果你想要你想要的东西,你必须回到unsigned char

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

注意:使用Stephen注释中指定的%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;
}

答案 1 :(得分:0)

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

printf("%u",(unsigned char)(i<<1));