我们知道我们的整形,浮点型这些数据是存储在内存中的,那你是否好奇他在内存中存储的,跟博主一起来增长增长内功吧~ ^-^
1.整数的二进制表示有三种:原码,反码,补码。
对于signed int : 最高位是符号位(1负,0正),其他都是数值位
对于unsigned int : 全部都是数值位 (这也是为什么unsigned最高取值比signed高的原因)
在内存中存的是补码,而在打印时用的是原码。
2.原码 反码 补码 的转化
对于正整数(unsigned int)他们的原码反码补码相同
对于负整数我们需要一点变化:
前面我们说到内存存的是补码,为什么呢?
使⽤补码,可以将符号位和数值域统⼀处理; 同时加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
#include
int main()
{
int a = 0x11223344;
return 0;
}
我们在调试发现低位字节44是放在前面的也就是低地址,高位字节11是放在后面也就是高地址
这种字节存储顺序就叫做小端存储。而相对的高字节放在低地址,低位字节放在高地址就是大端存储。
为什么会有大小端之分?
小科普: 我们常⽤的 X86 结构是⼩端模式,⽽KEIL C51 则为⼤端模式。很多的ARM,DSP都为⼩端模式。有些ARM处理器还可以由硬件来选择是⼤端模式还是⼩端模式。
1.取值范围
你是否好奇为什么signed char 和unsigned char 的取值范围分别是-128~127和0~255呢?
我们知道char是1个字节,二进制就是8个bit位,结合之前的知识我们可以不断加1得到他们数值变化
我们可以明显看到无符号和有符号的差异,值得注意的是有符号的10000000规定是-128,他们就像一个不断循环的圆环,注意对于有符号127+1是-128
char类型截断:当一个整形32位存进char会发生截断只存进8位,当打印时会发生整形提升,有符号的补符号位,无符号的补0.
说完了整形在内存的存储,我们要说个大家伙,浮点型在内存中的存储。
浮点数的取出按照E的不同分为以下三种情况:
E不全为0或不全为1
这时,浮点数就采⽤下⾯的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第⼀位的1。
⽐如:0.5 的⼆进制形式为0.1,由于规定正数部分必须为1,即将⼩数点右移1位,则为1.0*2^(-1),其阶码为-1+127(中间值)=126,表⽰为01111110,⽽尾数1.0去掉整数部分为0,补⻬0到23位00000000000000000000000,则其⼆进制表⽰形式为:
0 01111110 00000000000000000000000
E全为0
int main()
{
int n = 9;
float* pFloat = (float*)&n;
printf("n的值为:%d\n", n);//9
//00000000 00000000 00000000 00001001
printf("*pFloat的值为:%f\n", *pFloat);
//浮点数在内存中的取出 0 00000000 00000000000000000001001
//S=0 E = -126 M=0.00000000000000000001001
*pFloat = 9.0;//浮点型在数据的存储
//10进制 9.0
// 1001.0
//1.001x2^3
//S = 0 E = 3 M = .001
//0 00000011 00100000000000000000000
printf("num的值为:%d\n", n);
printf("*pFloat的值为:%f\n", *pFloat);
return 0;
}
你学会了吗?本次分享结束,希望小伙伴们多多三连!