我的疑问:计算机硬件怎么感知-128等于-0?
我的疑问:计算机硬件怎么感知-128等于-0?
以下面的程序入手分析:
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
分析上面的程序:a[i]=-1,-2,-3,…,-254,-255…,但是,这些数在计算机内部是怎么存的?
大前提是(char的默认状况是存的有符号数,并且数据在计算机内部是以补码的形式存的)
分析:-1原1000 0001,补1111 1111;
-2原1000 0010,补1111 1110;
……
-127原1111 1111,补1000 0001;
-128(溢出了,其实是假溢出),
本来的原码是:1 1000 0000
因为溢出,故:
原1000 0000
补1000 0000;
(注:此数即为-0的原码和补码,在计算机中,-0和-128所表示的数一样的)。
-129(已经溢出)
原 1 1000 0001
补 1 0111 1111;
此数已经溢出,(因为计算机内是以补码的方式存储的),故把最高位丢弃:
故补为:0111 1111
即-129相当于+1
然后进行新的一轮循环:
补码首位为0,说明数为正;
+2补码:0111 1110
+3补码:0111 1101
……
127的补码:0000 0001
128的补码:0000 0000
此补码已经为0。结束;
根据此种情况,把上面补码为0前面的所有的数的个数相加,结果为255,故此函数的输出为255.(因为strlen只是个计数器,碰到\0就结束,返回\0前的计数器的值)。
下面或许明白了,因为我们分析的是:数在计算机内存条上的实际的值(是用反码表示的),为了更明白说明问题,我列了下表:
原码顺序:-128,-127,-126 ,…, -1, +0, 1, 2, …,127;
补码顺序: -0 , -1, -2 ,…,-127,+0,127,126,…,1;
即char是根据此种顺序进行循环的的!
下面有一个疑问是:strlen函数是碰到0就结束的。第一:计算机内部的char类型是不能存-128的(因为位数不够),但可以允许溢出;第二:假如溢出的话,那么补码为-0,计算机怎么感知-0就是-128?为什么strlen遇到-0不结束?难道这是计算机开发者的硬性规定??