【C】取值范围
比特位
- CPU能读懂的最小单位——— 比特位,bit,b
- 比特位只能存放二进制数,即只能存放0或者1
字节
- 内存机构的最小寻址单位——— 字节,Byte, B
- 一个字节由八个比特位构成 1Byte == 8bit
- 一个字节可以表示的最大数
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
|---|
进制转换
| 二进制 | 十进制 | 十六进制 |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 1 | 1 |
| 10 | 2 | 2 |
| 11 | 3 | 3 |
| 100 | 4 | 4 |
| 101 | 4 | 4 |
| 110 | 6 | 6 |
| 111 | 7 | 7 |
| 1000 | 8 | 8 |
| 1001 | 9 | 9 |
| 二进制 | 十进制 | 十六进制 |
|---|---|---|
| 1010 | 10 | A |
| 1011 | 11 | B |
| 1100 | 12 | C |
| 1101 | 13 | D |
| 1111 | 15 | F |
| 10000 | 16 | 10 |
| 10001 | 17 | 11 |
| ... | ... | ... |
| 11001 | 25 | 19 |
| 11010 | 26 | 1A |
| ... | ... | ... |
| 11111111 | 255 | FF |
总结规律
| 二进制 | 十进制 | 十六进制 |
|---|---|---|
| 1 | 1(21-1) | 1 |
| 11 | 3(22-1) | 3 |
| 111 | 7(23-1) | 7 |
| 1111 | 15(24-1) | F |
| ... | ... | ... |
| 11111111 | 255(28-1) | FF |
规律:二进制数n个1转化为十进制为2的n次方减1,即2n-1
根据规律,我们可以得出32个比特位1的十进制就是232-1,即4294967295
C语言中,math库中的pow()函数可以用来求幂,具体用法为:pow(x,y)
#include <stdio.h>
#include <math.h> //导入头文件,math库
int main()
{
int result; //定义一个int变量命名为result
result = pow(2, 32) - 1; //求2的32次方减1
printf("result = %d\n", result);
return 0;
}
运行结果
warning: overflow in conversion from 'double' to 'int' changes value from '4.294967295e+9' to '2147483647' [-Woverflow]
result = pow(2, 32) - 1;
result = 2147483647
我们可以发现,在运行程序后,程序弹出警告,且得出的result为2147483647,而正确答案为4294967295,显然运行结果与我们想要的答案并不相符。这个问题就和符号位有关了。
符号位
- 存放signed类型的存储单元中,左边第一位表示符号位,剩下的为数值位。如果符号位为0,表示字节中存储的数值是正数;如果符号位为1,表示字节中存储的值是负数。
- 一个32位的整形变量,除去左边第一位符号位,剩下表示值的只有31个比特位
在上面的代码里,我们能看到
int result;
int前面没有任何内容,则默认情况下它是带符号位的(signed)。左边第一位为符号位,剩下的31位是数值位,所以得到的结果只有后边31位,即231-1。要得出正确的结果,我们要把数值存储到无符号(unsigned)的int中
修改结果:
int main()
{
unsigned int result; //定义一个无符号int变量命名为result
result = pow(2, 32) - 1; //求2的32次方减1
printf("result = %u\n", result); //用无符号形式打印
return 0;
}
补码
事实上计算机是用补码的形式来存放整数的值
- 正数的补码是该数的二进制形式
- 负数的补码需要通过以下几步获得:
- 先取得该数的绝对值的二进制形式
- 再将第1步的值按位取反,即0变成1,1变成0
- 最后将第2步的值加1
举个例子:
- 正数7的二进制形式为——00000111 (0是符号位,表示它是正数)
- 负数-7的二进制形式为——10000111 (1是符号位,表示它是负数),进行补码:
- 按位取反得——11111000
- 取反后加1得——11111001
从上述例子可以看出,对正数来说(符号位为0),它的二进制形式1越多,它的数值越大;对负数来说(符号位为1),它的二进制形式0越多,它的数值越大
最大值和最小值
正数的最大值是127,负数的最小值是-128
127——01111111
...
1——00000001
0——00000000
-1——11111111
-2——11111110
-128——10000000
基本数据类型的取值范围
| 数据类型 | 字节数 | 取值范围 |
|---|---|---|
| signed char | 1 | -128~127 |
| unsigned char | 1 | 0~255 |
| short | 2 | -32768~32767 |
| unsigned short | 2 | 0~65535 |
| int | 4 | -2147483648 ~ 2147483647 |
| unsigned int | 4 | 0~ 4294967295 |
| long | 4 | -2147483648 ~ 2147483647 |
| unsigned long | 4 | 0 ~ 4294967295 |
| long long | 8 | -9223372036854775808 ~ 9223372036854775807 |
| unsigned long long | 8 | 0 ~ 18446744073709551615 |
| 数据类型 | 字节数 | 取值范围(绝对值) |
|---|---|---|
| float | 4 | 1.17549 * 10-38 ~ 3.40282 * 1038 |
| double | 8 | 2.22507 * 10-308 ~ 1.79769 * 10308 |
| long double | 12 | 2.22507 * 10-308 ~ 1.79769 * 10308 |

浙公网安备 33010602011771号