1.2.1char型(8位)

char分为有符号型signed char和无符号型unsigned char。
1.无符号型unsigned char范围0~255,下面是计算方法:
最小0000 0000等于0;
最大1111 1111,先加1等于10000 0000=2的8次方=256,再减1等于255。
2.有符号型signed char范围是-128~127,下面是计算方法:
0代表正,1代表负。
最大值0111 1111先加1等于1000 0000=2的7次方=128,再减一等于127。
最小值1000 0000等于-128(2的7次方)。
一个字节(byte)等于8位(bit)

下面让我们赋值char c1 = 128,为啥会输出-128呢?
具体解释:
1.二进制表示:
128 的二进制表示是 10000000。对于有符号的 char 类型,最高位(最左边的位)是符号位。10000000 表示的是 -128(在二进制补码表示中)。
2.赋值操作:
当你执行char c = 128时,128被解释为char类型,由于超出了char的正数范围(-128~127),所以它会被截断并解释为-128。
3.输出:
printf("%d",c); 会输出c的整数型,即-128
printf("%c",c); 会输出c对应的ASCII字符。ASCII码-128对应的字符是非打印字符(通常显示为乱码或空白)。
总结:由于char类型范围是-128~127,赋值128会溢出,所以实际赋值变为-128。
因此printf("%d %c \n ",c,c); 会输出-128和一个非打印字符。

下面让我们赋值char c1 = 129,为啥会输出-127呢?
1.分析:char类型是有符号的8位整数,取值范围是-128~127,当赋值为129时已经发生了溢出。
129的二进制表示是10000001(8位),计算机在内存存储方式中是补码形式。
-
对于有符号的
char类型,最高位是符号位。10000001被解释为补码,其对应的十进制值是:-
按位取反:
01111110 -
加 1:
01111111 -
结果是
-127。
-
因此,char c = 129;实际上会将C的值设置为-127。
2.输出结果
-
printf("%d", c);会输出c的整数值,即-127。 -
printf("%c", c);会输出c对应的 ASCII 字符。ASCII 码-127对应的字符是非打印字符(通常显示为乱码或空白)。
3.实际运行结果

这里需要注意的是char类型是否默认是有符号型(signed char)还是无符号型(unsigned char)是由编译器实现定义的,一般是默认有符号型!!!
那如何明确指定char类型呢?
为了避免歧义,可以显式指定 char 的类型:
-
使用
signed char明确表示有符号字符。 -
使用
unsigned char明确表示无符号字符。

大家可以使用以下代码来确定自己的编译器是否是默认有符号型(signed char)
#include <stdio.h>
int main()
{
char c = -1;
if (c < 0) {
printf("char is signed.\n");
} else {
printf("char is unsigned.\n");
}
return 0;
}
-
如果输出
char is signed.,则说明char默认是有符号的。 -
如果输出
char is unsigned.,则说明char默认是无符号的。
下图为我的编译器code blocks是默认char为有符号型(signed char)

下面让我们赋值unsigned char c = -1,为啥会输出255呢?
-1的补码计算步骤:
-
绝对值:
1 -
二进制表示:
00000001 -
取反:
11111110 -
加1:
11111110+1=11111111 -
所以-1的补码是1111 1111

程序和结果显示如下图所示
-
unsigned char c = -1;:-1被解释为255,因为unsigned char是无符号类型。 -
printf("%d %c \n", c, c);:%d输出255,%c输出255对应的字符
下图为ASCII码图

补充:二进制是逢二进一,八进制是逢八进一,十进制,十六进制以此类推。
二进制:0 1 10 11 20 21 30 32.......
八进制:0 1 2 3 4 5 6 7
10 11 12 13 14 15 16 17
20 21 22 23 24 25 26 27.......
十进制:0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29......
十六进制:0 1 2 3 4 5 6 7 8 9 A B C D E F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F......
1855

被折叠的 条评论
为什么被折叠?



