虚拟资源站码支付wordpress,百度收录快速提交,柳州关键词优化网站,网站备案企业用个人来备案可以用吗1. 整数在内存中的存储
计算机中的整数有三种2进制表示方法 #xff1a;原码、反码、补码。
三种表示方式均有符号位和数值位两个部分#xff0c;最高一位的是符号位#xff0c;剩下的都是数值位。符号位用“0”表示“正”#xff0c;用“1”表示“负”。
正数的原、反、…1. 整数在内存中的存储
计算机中的整数有三种2进制表示方法 原码、反码、补码。
三种表示方式均有符号位和数值位两个部分最高一位的是符号位剩下的都是数值位。符号位用“0”表示“正”用“1”表示“负”。
正数的原、反、补码都相同。而负整数的三种表示方法各不相同说明如下 原码符号位为“1”数值位按数值的二进制形式表示 反码符号位不变数值位依次按位取反 补码反码 1
对于整形来说内存中存储的是补码。 为什么呢 在计算机系统中数值统一用补码来表示和存储。使用补码可以将符号位和数值位统一处理同时可以将加法和减法统一处理CPU只需要一个加法器。补码和原码之间的转换相对简单不需要复杂的额外硬件电路这进一步简化了硬件设计。 2. 大小端字节序
2.1 大小端介绍
当存储的数据超过一个字节的时候就会出现存储顺序的问题存储顺序分为大端字节序存储和小端字节序存储。说明如下
大端字节序存储数据的低位字节内容保存在内存的高地址处而数据的高位字节内容保存在内存的低地址处小端字节序存储数据的低位字节内容保存在内存的低地址处而数据的高位字节内容保存在内存的高地址处
为什么会有大小端模式之分呢
在计算机系统中每个地址单元都对应着一个字节byte一个字节为8bit位但是在C语言中除了8bit的char以外还有32bit的int那对于位数大于8位的处理器例如32位处理器由于寄存器宽度大于一个字节那么必然存在一个字节顺序安排的问题此时大端和小端模式应用而生。
2.2 经典练习题
练习1判断当前机器的字节序
#includestdio.h
int check_sys(){int i 1;return (*(char*)i);
}int main(){int ret check_sys();if(return 1){printf(Xiao);}else{printf(Da);}return 0;
}//check_sys2
int check_sys(){union{int i;int c;}un.i 1;return un.c;
}练习2
#includestdio.hint main(){char a -1;signed char b -1;unsigned char c -1;printf(%d\n%d\n%d\n,a,b,c);return 0;
}练习3
#includestdio.hint main(){char a -128;printf(%d\n,a);a 128;printf(%d\n,a);return 0;
}练习4
#includestdio.hint main(){char a[1000];int i;for(i 0;i 1000; i){a[i] -1 - i;}printf(%d,strlen(a));return 0;
}练习5
#includestdio.hunsigned char i 0;
int main(){for(i 0;i 255;i){printf(hello world\n);}return 0;
}#includestdio.hint main(){unsigned int i;for(i 9; i 0;i--){printf(%u\n,i);}return 0;
}练习6
#includestdio.hint main(){int a[4] { 1, 2, 3, 4 };int *ptr1 (int *)(a 1);int *ptr2 (int *)((int)a 1);printf(%x,%x,ptr1[-1], *ptr2);return 0;
}运行 练习2~6 的代码思考数据在内存中存储的小细节。
3. 浮点数在内存中的存储
根据国际标准IEEE电气和电子工程协会754任意一个二进制浮点数V可以表示成下面的形式
例如 十进制的5.0写成二进制是101.0等同于1.01 × 2^2。 按照上方V的格式可以得出S0M1.01E2。 十进制的-5.0等同于-1.01 × 2^2。 按照上方V的格式可以得出S1M1.01E2。
IEEE754规定
对于32位的浮点数最高的1位存储符号位S接着的8位存储指数E剩下的23位存储有效数字M。
对于64位的浮点数最高的1位存储符号位S接着的11位存储指数E剩下的52位存储有效数字M。
3.1 浮点数存的过程
关于有效数字 M
M的取值范围是1 ≤ M 2M可以写成1.xxxxxx的形式其中xxxxxx表示小数部分。
IEEE 754 规定在计算机内部保存M时默认这个数的第一位总是1因此可以不用存储只保存后面的xxxxxx部分等到读取的时候再把第一位的1加上去。这样做可以节省1位有效数字。
以32位浮点数为例留给M的只有23位将第一位的1舍去之后等于可以保存24位有效数字。
关于有效数字指数E
E为一个无符号整数unsigned int。所以说如果E为8位它的取值范围为0 ~ 255如果E为11位它的取值范围为0 ~ 2047。
众所周知科学计数法中的E是可以出现负数的所以IEEE 754规定存入内存时E的真实值要加上一个中间数对于8位的E中间数为127对于11位的E中间数为1023。
例如2^10的E是10所以保存成32位浮点数时必须保存成10 127 137即10001001。
3.2 浮点数取的过程
指数E从内存中取出有3种情况
1E不全为0或不全为1
浮点数采用上方的规则表示指数E的存储值减去127或1023得到真实值再将有效值M前加上第一位的1。
例如0.5的二进制形式为0.1由于规定正数部分必须为1即将小数点右移1位则为1.0 × 2^(-1)其E在内存中的存储值为-1 127(中间值) 126表示为01111110而尾数1.0去掉整数部分为0补齐0到23位为00000000000000000000000则其表示形式为 0 01111110 00000000000000000000000 2E全为0
浮点数的指数E等于1 - 127或1 - 1023即为真实值有效数字M不再加第一位的1还原为0.xxxxxx的小数。这样做可以表示 ±0以及接近于0的很小的数字。 0 00000000 00100000000000000000000 3E全为1
如果有效数字M全为0表示 ±无穷大S决定正负。 0 11111111 00000000000000000000000