3. C语言 数据在机器的存储形式

3.1. 1.无符号

原码 = 反码 = 补码,整个内存都是其数值位,因为没有符号所以直接是二进制数存放到内存中

例如:unsigned char a = 122;

二制: 111 1011
原码:0111 1011  //最终在计算机存储形式
反码:0111 1011
补码:0111 1011 

真值:

其补码为 0111 1011 $$ a = 02^7 + 12^6 + 12^5 + 12^4 + 12^3+ 02^2+12^1+12^0 = 64+32+16+8+2 = 122; $$

3.2. 2.有符号

3.2.1. 2.1.正数

正数的最高位是符号位0,其余为为数值位,且原码=反码=补码,最终补码的方式存储到计算机。

例如:unsigned char a = 122;

二制: 111 1010
原码:0111 1010 // 最高位为符号位 0
反码:0111 1010 // 最高位为符号位 0
补码:0111 1010 // 最高位为符号位 0 最终在计算机存储形式

3.2.2. 2.2.负数

正数的最高位是符号位0,其余为为数值位,且原码=反码=补码,最终补码的方式存储到计算机。

例如:unsigned char a = -122;

二制: 111 1010
原码:1111 1010 // 最高位为符号位 1 其它位为二进制数
反码:1000 0101 // 最高位为符号位 1 不变,其它位原码取反
补码:1000 0110 // 最高位为符号位 1 不变,其它位反码最后一位加1  最终在计算机存储形式

真值:

其补码为 1000 0110 $$ a = -12^7 + 12^2 +1*2^1 = -128+4+2=-122 $$

3.3. 3.赋值过程中类型转换

3.3.1. 3.1.浮点型赋值给整形

规则:舍弃小数部分,内存中以整形存在

如 int i =3.56;最终i =3;

3.3.2. 3.2.整形数据赋值给浮点数

规则:数值不变,但是以指数的形式存在内存中

如float a = 23;将按23的单精度指数形式存在内存中;

3.3.将double数值赋值给float类型变量,注意不能溢出

float f;

double d=123.456789e100;

f = d;就会出现错误,因为超过了float的范围

3.3.3. 3.4.字符型数据赋值给整形变量

规则:将字符的ASCII码赋给整形变量

3.3.4. 3.5.int short long 型的数据赋给 char型的数

规则:只将其底8位原封不动的送到char型的变量里

例如:

i=289 二进制: 00000001 001000001

c=33 二进制: 001000001

3.3.5. 3.6.将signed 型数据赋值给长度相同的unsigned类型的变量

规则:将存储单元的内容照搬,连符号位。

例如:

short int b = -1;

unsigned short a = b;

解析:

b的补码:

1111 1111 1111 1111

那么赋值给a后就是 0xffff;

所以最后a = 0xffff = 65535;

总结:不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传送。