3. 整数数据类型
计算机的内存和磁盘都是用来存储数据的工具。内部存储着大量二进制的数据。
现代计算机系统通常把 8 个二进制的位(bit)作为一个最小的存储单元进行管理。由8个位组成的存储单元称为 字节(Byte)。在写法上,通常 1b 代表一个位,而 1B 代表一个字节。
计算机的内存逻辑上是以字节为单位的存储单元,通常最小的分配单元就是一个字节,如果存储更大的数字可能需要临近的两个或四个字节来保存。
在计算机的内部,每个字节都有它的地址编号,这个编号用于定位这个字节在内存中的地址,以便于计算机的 CPU 对其进行访问和修改。
计算机的内存编号是从零开始的,每个字节的地址依次加一。对于一个 32 位的计算机系统,这个地址通常是 0~FFFFFFFF(十六进制表示)的范围。对于一个 64 位的计算机系统,这个地址通常是 0~FFFFFFFFFFFFFFFF的范围。
内存地址以示图:
+--------+--------+--------+ +--------+--------+--------+
| | | | ... | | | |
+--------+--------+--------+ +--------+--------+--------+
地址:0 1 2 ... FFFFFFFD FFFFFFFE FFFFFFFF
每个方块代表一个字节(8个位)。
说明:
在计算机的图书中,在表示位的分布情况时,通常最低位在最右侧,高位在左侧。在表示字节的分布情况时,通常低地址的字节在左侧或下面,高地址的字节在右侧或上面。
整数:
在 C 语言中,在使用计算机存储数据时,先要考虑存储的数据的取值范围和符号特征,然后再用相应的数据类型进行存储。不同的数据类型表示不同的存储的字节数和符号的表示方式。
在 C 语言中,整数的存储分为无符号整数(unsigned integer)和有符号整数(signed integer)两种。
无符号整型
无符号整型只能存储大于等于零的数据。
0~2550~655350~42949672960~ 由操作系统和编译器决定字节数0~18446744073709551616 或更大无符号整数内存表示如下:
unsigned char 7 0
+--------+
|XXXXXXXX|
+--------+
unsigned short int 15 0
+--------+--------+
|XXXXXXXX|XXXXXXXX|
+--------+--------+
unsigned int 31 0
+--------+--------+--------+--------+
|XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|
+--------+--------+--------+--------+
unsigned long long int
63 0
+--------+--------+--------+--------+--------+--------+--------+--------+
|XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|
+--------+--------+--------+--------+--------+--------+--------+--------+
X表示一个位的值 0 或 1。
有符号整型
有符号整型能存储大于等于零的数据,也能存储小于零的负数。
对于用符号的整数中,内存的最高位为符号位,0 表示正数,1 表示负数。当数据存储是负数时,使用补码的方式进行存储。
补码
即原数的绝对值取反再加一就是补码。如有符号的字符型整数-1 的补码是 11111111,-2 的补码是 11111110。
补码计算方法
-2 的补码计算,绝对值是 2,八位二进制表示为 00000010,取反后 11111101,再加上一后为 11111110。则 11111110 就是 -2 的补码。
补码的作用是方便计算机内部计算,如 -1 + 1 为零,计算方法为:
11111111
+ 00000001
----------
00000000
而 -1 的补码正是 00000000 再减一的结果,即二进制的滚轮向下滚动在借位得到的 11111111。想象一下燃气表在为零时倒转一个数字的情况你就能明白补码的含义了。
有符号整数内存表示如下:
signed char 7 0
+--------+
|SXXXXXXX|
+--------+
signed short int 15 0
+--------+--------+
|SXXXXXXX|XXXXXXXX|
+--------+--------+
signed int 31 0
+--------+--------+--------+--------+
|SXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|
+--------+--------+--------+--------+
signed long long int
63 0
+--------+--------+--------+--------+--------+--------+--------+--------+
|SXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX|
+--------+--------+--------+--------+--------+--------+--------+--------+
S表示符号位的值,0(表示正数) 或 1(表示负数)。
在上述 C 语言的类型表示中 signed 可以省略不写, 当 int 类型有 short 或 long 修饰时, int 也可以不写。因此我们常写 short 是表示 signed short int,写long 表示 signed long int。
练习:
问答:
- 有符号字符型
signed char能保存多少种数字? - 无符号字符型
unsigned char能保存多少种数字? - 无符号字符型
unsigned char占用几个字节? short类型占用几个字节?long long int类型能用来保存天上星星的数量吗?