今天遇到这样一个小程序,觉得当中有些问题很容易让人忽略的!

  这个程序代码如下:

  程序的结果为:

  我想很多像我一样的小白可能才开始是想不明白为什么最后的结果是255吧!首先,我们得知道 strlen()是计算字符串长度的函数,但为什么最后得到的字符串长度是255呢?定义的数组a中不是有1000个元素,并且for循环也是执行999次吗?

  对于char来说,我们得知道其隐含的结束标记是\0,当编译器识别一个char类型的变量时,读取到\0,则标志着结束;对于这个程序,我们还得注意char的取值围:-128~127

所以当i = 128时  a[128] = -1 -128 = -129 ,那么到这里就出现问题了,a 中元素的最小值只能为-128,怎么办?在这里得知道,在计算机中,存储数据都是以补码的方式存储的,-128在计算机中的编码为1000 0000  ,-1的补码为1111 1111 ,所以-129 的补码为 1 0111 1111 ,但是char中的二进制位只有八位,所以把最高位丢掉,剩下的其余为作为补码,也就是0111 1111(0x7f)通过循环,依次减一  0x7d,0x7c,0x7b,0x7a,0x79,0x78,0x77,0x76,0x75,0x74,0x73,0x72,0x71,0x70......0x00,所以当编码为0x00时,a[255]= 0;所以当a[255]= 0时,作为字符串结束的标志,在a[0]~a[254]的元素都不为0,所以最终程序执行的结果就是字符串a的长度为255.

最新文章

  1. 【原】AFNetworking源码阅读(五)
  2. ubuntu 入门
  3. 掌握Thinkphp3.2.0----内置标签
  4. Asp.Net MVC Filter 实现方式和作用范围控制
  5. Git环境的搭建及使用
  6. [译]Redis大冒险
  7. 问题-关于 in []使用过程中报错" Constant expression violates subrange bounds"
  8. CPU卡
  9. Effective前端6:避免页面卡顿
  10. Python中的命名空间概念
  11. 想要配置文件生效 需要通过添加到web.xml加载到内存中
  12. 环境变量误删path找回方法与mysql基础命令
  13. hashmap相关面试题
  14. vue 时间过滤
  15. CF1039C.Network Safety
  16. LINUX的DNS怎么设置?linux下如何修改DNS地址
  17. 解决: docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
  18. 科学-天文学-天文观测站:TMT(红外天文望远镜)
  19. UNITY 的GC ALLOC到底是什么
  20. AngularJS+bootstrap-switch 实现开关控件

热门文章

  1. JVM实用参数——新生代垃圾回收
  2. JVM类加载机制
  3. 编写高质量JavaScript代码的基本要点
  4. 第三节 构造一个简单的Linux系统MenuOS——20135203齐岳
  5. HBase Cassandra Riak HyperTable
  6. WCF初探-1:认识WCF
  7. JSP常见指令
  8. 如何提高Service的优先级避免被杀死或者杀死后如何再次重启Service?
  9. Linux下SVN命令
  10. iOS7程序内部如何打开评分页面