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不管怎么变化都会在这个范围内 所以是死循环