char型数据为什么用补码中的负零表示-128而不是128?

计算机中的整型和字符型数据都是按照补码方式存储的(这样计算更方便)


#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
void main(){
	char a = -128;//11000 0000(源码) --- 10111 1111(取反) --- 11000 0000(加一) --- 80(1000 0000)(去左端溢出数据,补码中的负零)
	char d = 128;// 01000 0000       --- 01000 0000       --- 80(1000 0000)(去左端溢出数据,补码)
			  //(80)(补码)1000 0000  ---1 1000 0000(取出符号位之后减一,发现值不够,自动在最左端补一) --- 1 0111 1111 --- 1 1000 0000(被还原成-128)
	char d2 = 129;// 01000 0001       --- 01000 0001       --- 81(1000 0001)(去左端溢出数据,补码)
			  //(81)(补码)1000 0001  --- 1000 0000(取出符号位之后减一) --- 1111 1111 (被还原成-127)
				//如果把计算机的去溢出数据规则改为去右端的数据,那么负零表示的是正128,按规则能够还原
	char b = -127;// 1111 1111(源码) ---  1000 0000(取反) ---  1000 0001(加一) --- 81(补码)
	char c = -0;//   1000 0000      ---  1111 1111        --- 10000 0000      --- 00
	char c2 = 0;//   0000 0000      ---  0000 0000      ---  0000 0000       --- 00
	printf("a=%p,b=%p,c=%p,d=%p",&a,&b,&c,&d);
	getchar();
}

按理说字符型数据应该是-127到127之间,然后有个正0和负0一共256个数据。我们可以看到按照补码的存储方式当存入-0余0时,还原的结果都是0。然而当存入-128是还原的结果是-128。这意味着在-128到127之间都可以存入多少还原就能得到多少。再来看128存入后的结果是80(与-128一样)还原得到的是-128。存入129还原得到的却是-127(如果存入127那么还原也会得到127),因此127是边界,超过127会发生越界,只有-128到127之间才能存入多少,解析后得到多少,否者数据会发生存a结果得到b而不是a一样的情况。说明除了-127到127之间还有-128也能存入多少就取出多少,即-128到127是范围。int,long等整型数据也是如此。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值