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

转载于:https://www.cnblogs.com/yishuihan/archive/2011/10/29/2228401.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值