文章目录
数据类型和取值范围
1.数据类型
1.1 整数类型
- short int (一般情况占2个字节大小)
- int (一般情况占4个字节大小)
- long int (一般情况占4个字节大小)
- long long int (一般情况占8个字节大小)
注:
-
short int <= int <= long int <= long long int
-
例:long int已经可以存放足够大的整数了,如果需要存放更大的整数,那么就要使用long long int
Data model short int long long long pointers/size_t LLP64/IL32P64 16 32 32 64 64 LP64/I32LP64 16 32 64 64 64 ILP64 16 64 64 64 64 SILP64 64 64 64 64 64
1.2 浮点数类型
- float
- double
- long double
1.3 字符类型
- char
注:
- char类型可以看作特殊的整型
- char字符型占用一个字节的空间,中文字符在不同的操作环境和编译器中占用不同大小的字节
- char类型在计算机中是按其ASCII码进行存储,ASCII是“整型”类数据,在内存中全部以补码形式存储
1.4 布尔类型
- C标准规范存储空间最小的是
_Bool
,因为只要求能足够容纳0和1两个数即可
1.5 sizeof运算符
-
sizeof运算符用于获得数据类型或表达式的长度
-
有以下三种格式
——sizeof(对象)
——sizeof(类型)
——sizeof 对象
问:sizeof是一个函数吗?
答:不是,虽然其后面有一个小括号,可填入参数,但sizeof只是一个特殊的操作符
1.6 signed和unsigned
-
signed 和 unsigned 为类型限定符(用于限定char和任意整型的符号类型)
-
格式为:
——[signed] short [int] ——unsigned short [int]
——[signed] int ——unsigned int
——[signed] long [int] ——unsigned long [int]
——[signed] long long [int] ——unsigned long long [int]
注:
- 一般整数类型默认为有符号类型
- 而字符类型根据不同环境和不同编译器可能为有符号类型也可能为无符号类型
问: unsigned int 和 int 哪个可以表示更大的整数
答:默认 int 是 signed 的,即带符号的整数,需要用一半的存储空间来存放负数,而 unsigned int 则是完全用于存放正数,因此 unsigned int 可表示更大的整数
2.取值范围
2.1 比特位
- 比特位(bit,b):CPU能读懂的最小单位
2.2 字节
- 字节(Byte,B):内存中的最小寻址单位
- 1Byte = 1bite
二进制 | 十进制 | 十六进制 |
---|---|---|
0 | 0 | 0 |
10 | 2 | 2 |
11 | 3 | 3 |
100 | 4 | 4 |
101 | 5 | 5 |
110 | 6 | 6 |
111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | 10 | A |
1011 | 11 | B |
… | … | … |
11111111 | 255 | FF |
所以一个字节一般能存放最大整数为255
但如果字节中第一个比特位为符号位,则能存放的最大整数为127
注
- 存放signed类型的存储单元中第一位表示符号位,如果该位为0,则表示该整数是一个正数;如果该位为0,则表示该整数是一个负数
- 事实上计算机是用补码的形式来存放整数的值(不论正数还是负数)
2.3补码
补码是什么:一个数在计算机中是以二进制的形式存放的,补码的发明是为了表示带符号数
-
正数的补码就是该数的二进制形式
-
负数的补码需要通过以下几步获得:
- 先获得该数的绝对值的二进制形式,但第一符号位为1
- 再将其除符号位之外按位取反
- 最后再加一
例1:
1 0 0 0 0 1 1 1 为 7的在计算机中的存储形式,前面第一位代表符号位(实际应为三十二个比特位,这里只是大概表示)
进行补码:
1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 这就为-7在计算机中的存储形式(实际应为三十二个比特位,这里只是大概表示)
2.4 基本数据类型的取值范围
数据类型 | 字节数 | 取值范围 |
---|---|---|
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 * 10 ^ 38(绝对值) |
double | 8 | 2.22507 * 10 ^ -308 ~ 1.79769 * 10 ^308(绝对值) |
long double | 12 | 2.22507 * 10 ^ -308 ~ 1.79769 * 10 ^308(绝对值) |
问:为什么一个有符号字节储存的正数最大为127,而储存的负数最大值为-128
答:因为正数需要多一位来存放0