include<stdio.h>
int main()
{
for (char i = 0; i < 127; i++)
{
printf("%d\n", i);
}
}
这样的一个代码很熟悉吧,他是一个简单的for循环,让i从0开始,一直打印到126.
如:
当我们把“i的取值范围”改为“i<=127”的时候会是什么样子呢?会不会像上面一样从“0”一直打印到“127”呢?让我们一起来看看。
为什么结果会这样呢?
让我们来看看 char 的取值范围:
Char 在有符号数时: -128~127
在无符号数是: 0~256
这里当i++ 到i=127时 可以说是达到了char 的范围边缘。但是 取值范围是 -128~127 即相当于是一个圆,127的下一个-128,刚好-128<127所以继续打印,因此才会一直循环。
Char 的取值范围为什么是 “-128~127”呢?
让我们一起来看看,,,,,,
Char 在计算机中占一个字节,八个位。但是在高位代表了符号位其他就是7位,一共可以表示(2^7)127个数字,即0~~127.既然有符号位,就是有正有负,那么就是“0-127”和“-127~-0”,在这里的“-0”就比较有趣了,显得格格不入。
让我们一起来看看
-0 原码 1 000 0000 -128 原码 1 1000 0000
反码 1111 1111 反码 1 0111 1111
补码 1 0000 0000 补码 1 1000 0000
在计算机中只有8位 多余的位数直接舍去,那么-128的原码是 1000 0000 这样的话-128和-0是一样的 所以 在负数时 char的取值范围是 “-128~-1”
这时我们来看看 128 原码1000 0000 所以第一位是 符号位 即“-0”也就是“-128”
129的 原码 1000 0001 按照我们刚才说的 第一位是 符号位 那么应该是“-1”为什么是“-127”呢???
那么这里我们就要说说 负数的二进制;
在求负数的二进制的时候,我们需要取反加一。即对负数二进制取其反码在加一。
129 原码 10000001 128 原码 1000 0000
反码 11111110 反码 1111 1111
加一 1111 1111 加一 1 10000 0000
即 -127 即 -128
因此得到了 char 的取值范围是 -128~127