对char类型的理解以及对补码的理解分析
2024-10-08 21:47:31
今天遇到这样一个小程序,觉得当中有些问题很容易让人忽略的!
这个程序代码如下:
程序的结果为:
我想很多像我一样的小白可能才开始是想不明白为什么最后的结果是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.
最新文章
- 【原】AFNetworking源码阅读(五)
- ubuntu 入门
- 掌握Thinkphp3.2.0----内置标签
- Asp.Net MVC Filter 实现方式和作用范围控制
- Git环境的搭建及使用
- [译]Redis大冒险
- 问题-关于 in []使用过程中报错"; Constant expression violates subrange bounds";
- CPU卡
- Effective前端6:避免页面卡顿
- Python中的命名空间概念
- 想要配置文件生效 需要通过添加到web.xml加载到内存中
- 环境变量误删path找回方法与mysql基础命令
- hashmap相关面试题
- vue 时间过滤
- CF1039C.Network Safety
- LINUX的DNS怎么设置?linux下如何修改DNS地址
- 解决: docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
- 科学-天文学-天文观测站:TMT(红外天文望远镜)
- UNITY 的GC ALLOC到底是什么
- AngularJS+bootstrap-switch 实现开关控件