【C】取值范围

比特位

  1. CPU能读懂的最小单位——— 比特位,bitb
  2. 比特位只能存放二进制数,即只能存放0或者1

字节

  1. 内存机构的最小寻址单位——— 字节,Byte B
  2. 一个字节由八个比特位构成 1Byte == 8bit
  3. 一个字节可以表示的最大数
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. 先取得该数的绝对值的二进制形式
    2. 再将第1步的值按位取反,即0变成1,1变成0
    3. 最后将第2步的值加1

举个例子:

  1. 正数7的二进制形式为——00000111 (0是符号位,表示它是正数)
  2. 负数-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
posted @ 2025-02-14 21:00  芝麻凛  阅读(45)  评论(0)    收藏  举报