C语言:printf char显示ffffff

前言

C99标准《ISO/IEC 9899:1999》6.3.1.1中第2段末尾写到:

If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions. All other types are unchanged by the integer promotions.

我的理解

1.converted(转换,怕翻译得不准确)只是针对于显示的时候,不要理解成初始化的时候在内存中converted。

1
2
char a = 0xcf;
printf("%x\n", a); //0xffffffcf //64位

等同于

1
printf("%x\n", (int)a); //0xffffffcf //64位

2.一个signed有符号的变量,进行位运算之后,就成了unsigned.

1
2
3
4
5
char a = -1; //1000 0001  -> 反码1111 1110 -> 补码1111 1111(内存中的形式)
printf("%x\n", a); //ffffffff
printf("%d\n", a); //-1
printf("%x\n", a&0xff); //ff
printf("%d\n", a&0xff); //255

3.所以,要解决signed char类型出现ffffff的情况,可以使用unsigned char 或者 &0xff.

疑惑点

计算机对于
1111 1111
这段内存,它是怎么区分首位的1是不是代表符号?

念念不忘,必有回响。