无符号字符的最大值

Var*_*nce 8 c bit-manipulation unsigned-char

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

为什么这个程序打印256?

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

Bil*_*eal 14

这是C的整数提升规则的结果.从本质上讲,进入表达式的大多数变量都是"提升"的,因此这样的操作不会失去精度.然后,它通过作为intprintf,根据到C的可变参数的规则.

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

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

注意:使用%cStephen注释中的指定将不起作用,因为也%c需要一个整数.

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

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

要么

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",(i<<1) & 0xFF);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)