# C语言 数据在机器的存储形式 ## 1.无符号 原码 = 反码 = 补码,整个内存都是其数值位,因为没有符号所以直接是二进制数存放到内存中 ``` 例如:unsigned char a = 122; 二制: 111 1011 原码:0111 1011 //最终在计算机存储形式 反码:0111 1011 补码:0111 1011 ``` 真值: 其补码为 0111 1011 $$ a = 0*2^7 + 1*2^6 + 1*2^5 + 1*2^4 + 1*2^3+ 0*2^2+1*2^1+1*2^0 = 64+32+16+8+2 = 122; $$ ## 2.有符号 ### 2.1.正数 正数的最高位是符号位0,其余为为数值位,且原码=反码=补码,最终补码的方式存储到计算机。 ``` 例如:unsigned char a = 122; 二制: 111 1010 原码:0111 1010 // 最高位为符号位 0 反码:0111 1010 // 最高位为符号位 0 补码:0111 1010 // 最高位为符号位 0 最终在计算机存储形式 ``` ### 2.2.负数 正数的最高位是符号位0,其余为为数值位,且原码=反码=补码,最终补码的方式存储到计算机。 ``` 例如:unsigned char a = -122; 二制: 111 1010 原码:1111 1010 // 最高位为符号位 1 其它位为二进制数 反码:1000 0101 // 最高位为符号位 1 不变,其它位原码取反 补码:1000 0110 // 最高位为符号位 1 不变,其它位反码最后一位加1 最终在计算机存储形式 ``` 真值: 其补码为 1000 0110 $$ a = -1*2^7 + 1*2^2 +1*2^1 = -128+4+2=-122 $$ ## 3.赋值过程中类型转换 ### 3.1.浮点型赋值给整形 规则:舍弃小数部分,内存中以整形存在 如 int i =3.56;最终i =3; ### 3.2.整形数据赋值给浮点数 规则:数值不变,但是以指数的形式存在内存中 如float a = 23;将按23的单精度指数形式存在内存中; 3.3.将double数值赋值给float类型变量,注意不能溢出 ``` float f; double d=123.456789e100; f = d;就会出现错误,因为超过了float的范围 ``` ### 3.4.字符型数据赋值给整形变量 规则:将字符的ASCII码赋给整形变量 ### 3.5.int short long 型的数据赋给 char型的数 规则:只将其底8位原封不动的送到char型的变量里 例如: i=289 二进制: 00000001 001000001 c=33 二进制: 001000001 ### 3.6.将signed 型数据赋值给长度相同的unsigned类型的变量 规则:将存储单元的内容照搬,连符号位。 例如: ``` short int b = -1; unsigned short a = b; ``` 解析: b的补码: ``` 1111 1111 1111 1111 ``` 那么赋值给a后就是 0xffff; 所以最后a = 0xffff = 65535; ***总结:不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传送。***