1.正负数的编码形式
在整数的表示中,有两种不同的表达方式,一种只能表示非负数,而另一种能够表示负数,零和正数。
char [-128,127] char [0,255]
short [-32768,32767] short [0,65535]
int [-2147483648, 2147483647] int [0,4294967295]
不同类型的位数的机器会有不同的取值范围
就以short v = 12345;而言,它得二进制编码就为 0011 0000 0011 1001
那么short v = -12345呢?
我们都知道12345 + (-12345) = 0
所以负数,在常见得计算机表示方式,使用的就是补码形式
例如
[0001] = - 0 * (2 * 2 * 2) + 0 * (2 * 2) + 0 * (2 * 1) + 1 * (1) = 0 + 0 + 0 + 1 = 1
[1111] = - 1 * (2 * 2 * 2) + 1 * (2 * 2) + 1 * (2 * 1) + 1 * (1) = -8 + 4 + 2 + 1 = -1
[0001] + [1111] = 1[0000] 因为只保存4位所以 = [0000] = 0
因此short v = - 12345 的二进制编码为:1100 1111 1100 0001
2.有符号数和无符号数之间的转换
C语言允许在各种不同的数字数据类型之间做强制类型转换
例如 :
short v = -12345;
unsigned short uv = (unsigned short) v;
printf(“v = %d, uv = %u \n”, v, nv);
v = -12345, uv = 53191
unsigned u = 4294967295u;
int tu = (int) u;
printf(“u = %u, tu = %d \n”, u, tu);
u =4294967295, tu = -1