整数在内存中的存储练习

文章讨论了使用无符号整型变量作为循环控制时可能出现的死循环现象,解释了由于类型转换和补码机制导致的数值误解,以及在打印和存储过程中的影响,如%d与%u的区别,以及在char类型数组中存储超出范围值时的截断效应。
摘要由CSDN通过智能技术生成

1.

2.

注意的是当无符号整型变量来控制循环变量的时候 很可能会造成死循环

i在这道题中会一直-- 当i变成-1是 因为i的类型是unsigned int 所以把-1的补码看成是无符号的整数

11111111111111111111111111111111 -1的补码 最高位是数据位 是一个巨大的正整数 所以能进入循环 以%u打印是以无符号整型打印 那么把-1的补码就当作是一个无符号整型来看 是一个巨大的值 所以会出现图上的结果 死循环的打印

3.

这个同上 只是区别于以%d打印 以有符号整型打印

进入循环时取决于unsigned int的类型 打印时取决于%d还是%u

这道题时%d打印 打印的就是有符号的整型 所以 内存中-1的补码在unsoigned int看作就是一个巨大的正整数 在%d看作就是一个有符号的内存补码 结果是-1

-2 -3 也一样 死循环打印

4.

对于这道题是相当于将int类型的i放入char类型的数组里进行初始化的题 问到的是strlen(a)就是求字符串长度 字符串长度是求\0之前元素的个数 \0的ASCII又是0 所以当a[i] = 0的时候计算前面元素的个数就可以了

对于-1-i来说 随着i的增大 这个值是由-1~-1000来增长的

对于a[i] 来说把-1-i放入到a[i]中 a[i]是char类型 范围是-128~127 放不下 所以要发生截断 截断到a[i]里的值就是-1 -2 -3... -128 127 126 125...3 2 1 0 -1 -2..这样来回循环的 一共是1000个这样的数字

所以遇到第一个0的时候就计算前面的元素是255个

5.

unsigned char类型的取值范围是0~255 如果有比这个数大的值放入这个类型的变量中 就会发生截断

得到一个这个类型范围内的值 所以i不管怎么变化都会在这个范围内 所以是死循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值