Unsigned 陷阱

unsigned是整形的一种类型,表示无符号,一般用于unsigned int和unsigned char,如果没有理解unsigned的意义将会在做题中掉入陷阱,下面通过介绍几个例子来说明:
1、

int main()
{
   unsigned  int  i;
   for (i = 10;i >= 0; i--)
   {
      printf("你好\n");
   }
   return 0;
}

这个程序,打眼一看结果就是输出11个“你好”,然而并不是这样,输出的一个死循环,为什么呢?
当i=0时,输出第11次“你好”,再次执行i–时,i本应该等于-1,此时已经不符合i>=0的条件,应该退出循环,但应该注意i是无符号整形,当i=-1时,此时的i是有符号的,此时就要用到数据在计算机中的存储方式是二进制。
-1:
原码:1000 0000 0000 0000 0000 0000 0000 0001
反码:1111 1111 1111 1111 1111 1111 1111 1110
补码:1111 1111 1111 1111 1111 1111 1111 1111
由于-1是负数,故原码最高位为1,取反码时,最高位不参与,最终的补码就是-1在计算机中存储的二进制,此时i就默认等于4294967295,因为其原码和-1的补码相同,也就是说i永远满足i>=0条件。
2、

int main()
{
   unsigned char a[500];
   int i;
   for (i = 0;i < 500; i++)
   {
      a[i] = -1 - i;
   }
   printf("%d",strlen(a));
   system("pause");
   return 0;
}

和上面一道题一样,打眼一看结果就是500,毫无疑问,然而结果总是出人意料,结果是255,这又是为什么呢?

unsigned char的取值范围是0-255,当i=0时,a[0]=255,a[1]=254,当i=255时,-1-i=-256,此时已超过了unsigned char的范围。
-256:
原码:1 0000 0000
反码:0 1111 1111
补码:1 0000 0000
因为unsigned char 是一个字节,8个bit,所以就失去了最高位1,此时a[255]=0,注意后面的strlen(a)函数,这是一个计算数组元素个数的函数,逢“0”就停止计算,就是说计算到a[255]的时候就停止了,计算了从a[0]-a[254]共255个数,最终结果就是255。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值