存储负数

int main()

 char a[1000];
 int i;
 for (i=0;i<1000;i++) {
  a[i]=-1-i;
 }
 printf("%d",strlen(a));
 return 1;
}
 
如上,最后打印的结果是255
 
分析:
我们编写的任何数据传到计算机底层都会变成0和1,把基本数据类型的最高位腾出来
最高位是1,代表这个数位负数,最高位是0,代表正数。
因此char的数据类型虽然占有8位(1字节),但实际表示的范围则是 : -2^7~2^7-1

当最高位是1,其他位都是0时,则此时最高位的1即代表这个数是负数,也代表这个数的最高位。

而且,在计算机存储数字时,会存储这个数的补码,主要原因是使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

 

回到题目,

-1的补码是11111111

当i的值为127时,a[127]值(char类型中不同的值代表不同的字符)为-128,二进制表示为:10000000           在计算机底层存储为:10000000
当i=128时,a[128]的值不可能等于-129,因为此时如果是-129的话,二进制表示为110000001  应存储为:101111111
包括符号位已经是9位,超出了char类型的位数,计算机舍弃最高位,将这个数存储为:01111111  变成了正数127

同理,当i=255时,-256的补码的低8位是0,当i=256时,-257的补码的低八位是11111111,跟-1的补码一样,数组开始循环。

 

而strlen是计算字符串长度的,遇到'\0'时结束,返回字符串不包括'\0'的长度,

因为a[255]的值为0,代表的字符为'\0'

所以打印出来的数是255

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值