计算机中的整型和字符型数据都是按照补码方式存储的(这样计算更方便)
#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等整型数据也是如此。