C_易水寒

海角C语言,被遗忘的凄美故事!剜骨放血,只有最深痛的记忆留在中枢神经!

导航

我的疑问:计算机硬件怎么感知-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不结束?难道这是计算机开发者的硬性规定??

posted on 2011-10-29 10:31  C_易水寒  阅读(1173)  评论(5编辑  收藏  举报