几个越界的问题

几个越界的问题

分类: C   8人阅读  评论(0)  收藏  举报
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. int main()  
  4. {  
  5.     char a[1000];  
  6.     int i;  
  7.     for(i=0; i<1000; i++)  
  8.     {  
  9.      a[i] = -1-i;  
  10.      }  
  11.     printf("%d",strlen(a));  
  12.     return 0;  
  13. }  

  上述结果255,在计算机种采用补码的方式存储负数,补码即为原码取反加1,故-1的补码为0xff,同时可以得到一结论,原码+补码 = 2的(sizeof(码的类型))次方,如对于char型变量的-1来说,原码1 + 补码ff = 2^8.

  对于本题因strlen输出长度是以'\0'结尾的,而在计算机中所有数据在内存中都是以二进制存在的,'\0'的ASCII码为0,所以在数组中只要遇到数组元素为0,即表示strlen函数计算结束,返回0前面的数组元素个数,因此该题只需知道数组的第几个元素为0即可,即在内存中该元素表示为1 0000 0000(当然这里的1只是表示数在内存中存储,实际上因为char是8位的,已将该位舍去)取其补码(取反加1)为255即a[254] = 0,那么strlen(a) = 255就是理所应当了,其实从前面的分析也可得出,如果去掉

  1. a[i] = -1-i;  

那么strlen(a)结果是未知的,因为数组未初始化,系统会为其分配随机值。


  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. int main()  
  4. {  
  5.       
  6.     int i = -20;  
  7.     int j = 10;  
  8.     printf("%d",i + j);  
  9.     return 0;  
  10. }  
按前面所说int型20的补码为2^32 - 20(为了方便已将二进制转换为十进制,后面相同),i+j 会进行类型转换int -> unsigned int ,故i+j =  2^32 - 20 +10,然最后是要按无符号数输出则2^32 - 20 +10取补码为2^32 -( 2^32 - 20 +10) = 10(这里是10没有写错)

故输出-10,若是按%0x输出结果必为2^32 - 20 +10 = 0xfffffff6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值