原码 补码 反码

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值