#include<stdio.h>
int main()
{
char c1=97;
char c2=98;
printf("%c %c\n",c1,c2);
printf("%d %d\n",c1,c2);
return 0;
}
这个代码比较简单,char类型占一个字节,范围为-128-127,根据ASCII可以知道97对应a,98对应b
输出结果为:
a b
97 98
请按任意键继续...
下面再看一段代码
#include<stdio.h>
int main()
{
char c1 = 197;
char c2 = 198;
printf("%c %c\n", c1, c2);
printf("%d %d\n", c1, c2);
return 0;
}
输出结果为:
? ?
-59 -58
请按任意键继续...
这个代码为什么整型输出结果是-59 -58?
首先我们要了解原码,补码,反码。十进制位转换成二进制储存时,是以补码形式存放的。正数的原码=补码=反码,负数的反码=原码除符号位全部取反(符号位为第一个数字,0表示正数,1表示负数),补码=反码+1
以整型举例,整型占四个字节
1 的原码、反码、补码均为00000000000000000000000000000001
而-1 原码为10000000 00000000 00000000 00000001
反码为11111111 11111111 11111111 11111110
补码为11111111 11111111 11111111 11111111
char占一个字节,我们先进行整型提升(有符号按照符号位提升,无符号位补0),所以197原码、反码、补码为:00000000 00000000 00000000 11000101,char只读取1个字节1100 0101,此时是补码的形式,我们提升后转换成反码:11111111 11111111 11111111 1100 0100,原码:100000000 00000000 00000000 0011 1011所以输出为-59,同理198输出为-58
那么为什么char类型的范围是-128-127呢,咱们来探讨一下:
首先char类型只占一个字节即八个比特位,那么他能代表的最大数为1111 1111转换成十进制是255,但是计算机认为首元素为符号位,而1代表负数所以实际上1111 1111打印出来是-127,所以实际上char能表示的最大数字是0111 1111也就是127,此时如果再+1,二进制变为1000 0000代表-128。所以char类型的表示范围是-128-127