举例
我们以signed的char为例:
0000 0000
其中最高比特位是符号位
那剩下的7个就是数值位了
对于原码
1 111 1111对应 -127
0 111 1111 对应127
那取值范围是-127~127吗?
对于七位数据位,取值范围是0-127
我们发现当符号不同的时候,0出现了两次
分别是:
0 0000000
1 0000000
我们默认使用0 0000000为0
那1 0000000用来表示-128
所以char的正确取值范围是-128~127(-2^7,2^-1)
-128/有符号1000 0000的具体解释
-128存的过程:
-128的原码:1 1000 0000(9个bit位,出现9个bit位是因为计算机硬件参与运算的,)
反码:1 0111 1111
补码:1 1000 0000
将补码放入char类型的空间时会发生截断,存的是1000 0000
所以char中自然1000 0000用来表示-128
-128取得过程
char是有符号数,有符号位
1000 0000是负数
那反码是0111 1111
原码 是0000 0000 对吗?
不对的,之前发生过截断,无法正确计算原码
所以对于-128是半计算,半规定的一种存取方式
计算体现在存上,规定体现在取上
所以对于1000 0000我们不需要原反补转换
直接解释为-128
推论:
char -2^7~2^7(几次方就是数据位位数)
short -2^15!2^15
int -2^31~2^31
......
题目:
下面代码打印多少
int main()
{
char a[1000];
for(int i=0;i<1000;i++)
{
a[i]=-1-i;
}
printf("%d",strlen(a));
}
打印255
我们知道strlen碰到/0终止
-1在加到-128时变为正数127
再加127变为0
所以当a[i]=0时,i=255