C语言char类型

char类型

首先我们要知道char类型为一个字节。
而且要知道他在计算机中的储存方式。
一个字节8个bite,int类型32bite,0x00 00 00 01刚好没量为数为一个字节,这正是内存的储存方式
例如

char a=5;//a=0000 0101  正数的源码补码反码相同
char b=-5;//  b=1000 0101(源码)-》1111 1011(补码)
int x=(int)a;//x=00 00 00 05(16进制),在这里涉及类型变换时的扩充,当正数扩充时需要在他前面补0
int y=(int)b;//y=ff ff ff fb,负数的扩充则需要在他前面补f

同理类型转换时有扩充自然也会有缩减,缩减时,只需将多出来的位数删去就好。
现在我们来看例题

char ch=130;
print("%d",ch);//会输出-126,这是应为有符号char的范围是127到-128
//ch的值超过127时就会自动转换为补码形式,且该值作为补码存放
//130=1000 0010(补)单从补码来看这是一个负数
//那么他的原码就是1111 1110(-126)

在例如

char a=100;//a=0110 0100(原,补)
char b=200;//b=1100 1000(补,因为超过127所以直接作为补码处理)
char c=a+b;//a+b时会扩充为int类型处理再相加,然后在缩减为char类型
printf("%d,%d",c,a+b);

在这里插入图片描述
这个结果不是说明他们两个的值一定相同,这只是在当前的赋值情况下会出现一样的结果,实际情况需要计算。
下面来解释说明
要算a+b所以
a转换为int的结果为
a=0000 0000 0000 0000 0000 0000 0110 0100
b=1111 1111 1111 1111 1111 1111 1100 1000
a+b=1 0000 0000 0000 0000 0000 0000 0010 1100
注意最前面那个1不是符号位,那只是溢出的一位数,真正的符号为还是第二个0,所以就a+b的int类型结果来说总的结果为44,同时缩减后变为char类型的结果是0010 1100=44.
所以两份结果是这么得出的。

接着再来看一个例题
先告诉你unsigned char范围为0-255

unsigned char x=100;
unsigned char y=200;
unsigned char z=x+y;
printf("%d,%d",z,x+y);

在这里插入图片描述
x=0110 0100
y=1100 1000
x+y=
0000 0000 0000 0000 0000 0000 0110 0100
0000 0000 0000 0000 0000 0000 1100 1000
0000 0000 0000 0000 0000 0001 0010 1100
x+y(的int类型结果为300)
当转换为char类型的char时就将前3个字节个去掉了所以剩下了44

猜你喜欢

转载自blog.csdn.net/qq_40738945/article/details/85224222