我们知道,计算机内部存储和处理的信息都是以二值信号来表示,也就是一个位要么是0要么是1,而单个的位(二进制数字)用处不是很大,假设组合这些位,那么这些组合起来的位,就可以有特殊含义,也就是说建立编码系统,就可以更好地表示信息。那么接下来,研究计算机最重要的三种数字表示:
- 无符号(unsigned)编码:基于传统的二进制表示法,只能表示非负数字。
- 补码编码:表示有符号整数的最常见的方式,可以表示正数、负数、0。
- 浮点数编码:用2为基数的科学计数法来表示实数。
整数的表示:
在c语言中,支持多种整型数据类型,这些类型可以用关键字来指定大小,比如char、short、int、long等,不仅如此,C语言还可以用unsigned来声明该数是非负数,下面列举C语言的数据类型的典型取值范围:
数据类型 最小值 最大值 byte char -128 -127 1 unsigned char 0 255 1 short -32768 32767 2 unsigned short 0 65535 2 int -2147483648 2147483647 4 unsigned 0 4294967295 4 long -9223372036854775808 9223372036854775807 8 unsigned long 0 18446744073709551615 8 int32_t -2147483648 2147483647 4 uint32_t 0 4294967295 4 注:
1、上述为大多数64位机器的典型取值范围,其中long类型跟机器字长有关,32位机器的long型表示的范围为[-2147483648,2147483647],而unsigned long为[0,4294967295]
2、有一个关系要明白:一个字节等于8个位,即1 byte = 8 bit,而一个位要么是0要么是1,则8个位则有{[00000000],[00000001]…[11111111]}总共2^8=256个组合。
3、为什么char只能表示[-128,127]总共2^8=256个整数呢? 有前面第二点的解释,因为一个char类型是1个字节,而8个位最大只有256组合,所以char型最多表示256个整数,同样,short和int等,以此类推。
假设一个整数数据类型的数x有n位,第n位的数表示为 x n − 1 x_{n-1} xn−1,所代表的无符号数为 x u x_u xu,根据无符号数编码的定义: x u x_u xu = ∑ i = 0 n − 1 \sum_{i=0}^{n-1} ∑i=0n−1 x i x_i xi 2 i 2^i 2i
举三个栗子:
编码为 [ 0000 ] 2 [0000]_2 [0000]2所代表的整数为:0 ⋅ \cdot ⋅ 2 3 2^3 23+0 ⋅ \cdot ⋅ 2 2 2^2 22+0 ⋅ \cdot ⋅ 2 1 2^1 21+0 ⋅ \cdot ⋅ 2 0 2^0 20 = 0;
编码为 [ 0010 ] 2 [0010]_2 [0010]2所代表的整数为:0 ⋅ \cdot ⋅ 2 3 2^3 23+0 ⋅ \cdot ⋅ 2 2 2^2 22+1 ⋅ \cdot ⋅ 2 1 2^1 21+0 ⋅ \cdot ⋅ 2 0 2^0 20 = 2;
编码为 [ 1011 ] 2 [1011]_2