整数
整数的 2进制表⽰⽅法 有三种,即原码、反码和补码
正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码
对于整形来说:数据存放内存中其实存放的是补码
浮点数
#include <stdio.h>
int main()
{
int n = 9;
float *pFloat = (float *)&n;
printf("n的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
*pFloat = 9.0;
printf("num的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
上⾯的代码中, num 和 *pFloat 在内存中明明是同⼀个数,为什么浮点数和整数的解读结果会差别 这么⼤?
根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (−1) ∗ S M ∗ 2E • (−1)S 表⽰符号位,当S=0,V为正数;
当S=1,V为负数 • M 表⽰有效数字,
M是⼤于等于1,⼩于2的 • 2 E 表⽰指数位
代码的解释
int main()// 难
{
int n = 9;
float* pFloat = (float*)&n;
printf("n的值为:%d\n", n);//9
printf("*pFloat的值为:%f\n", *pFloat);//0
*pFloat = 9.0;
//任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
//V= (−1)^S M ∗ 2^E
// (−1)^S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
// M 表⽰有效数字,M是⼤于等于1,⼩于2的
// 2^E 表⽰指数位
//1001 - 9的二进制位
// 因为是正整数 所以 S =0;
//1.001 -M 1<=M<2
//1.001* 2^3 =9 所以 E = 3;
//第⼀位的符号位S=0,有效数字M等于001后⾯再加20个0,凑满23位,指数E等于3+127=130,即10000010
//写成⼆进制形式,应该是S+E+M,即 0 10000010 001 0000 0000 0000 0000 0000
printf("num的值为:%d\n", n);//1091567616
printf("*pFloat的值为:%f\n", *pFloat);//9
return 0;
}