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;
总结:不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传送。