目录
1、大端字节序与小端字节序
1.1 字节序的产生
首先需明确的是数据存储单位为字节,当数据以多字节形式进行存储时则需要考虑存储顺序,单字节存储无需考虑。
1.2 理解大小端字节序
大端字节序:数据低位存放高地址,数据高位存放低地址。
小端字节序:数据高位存放高地址,数据低位存放低地址。
1.2.1 举例说明
设有整型变量存放值0x11223344,大小端存储模式如下:
显然在VS平台下,数据为小端存储。
1.2.2 用程序判断大小端存储
代码思路:判断低地址起始的第一个字节的内容就可以判断大小端了。同样以0x11223344为例,若第一个字节为0x44则为小端。由于传参类型为整型,需要取出一个字节则可以使用char类型的强制类型转换。代码如下:
#include <stdio.h>
void Judge_Storage(int num)
{
char* ptr = (char*)#
if (0x44 == *ptr)
{
printf("小端");
}
else
{
printf("大端");
}
}
int main()
{
int A = 0x11223344;
Judge_Storage(A);
return 0;
}
2、整型在内存中的存储
2.1 原码、反码与补码
原码:有符号整数的二进制形式,第一位表示符号位,其余表示数值。
例如:
1的原码在32位机器上的表示为:
-1的原码在32位机器上的表示为:
反码:正数反码与原码相同;负数反码符号位不变,其它位按位取反。
例如:
1的反码在32位机器上的表示为:
-1的原码在32位机器上的表示为:
补码:正数补码与原码相同;负数补码为反码加1.
例如:
1的补码在32位机器上的表示为:
-1的补码在32位机器上的表示为:
2.2 反码和补码原理
计算机中的任何数据类型都有上限和下限,譬如signed char 类型取值是 ,short int类型是等,由此可以推处是下限,是上限。
当有符号数的数字溢出范围时,又会重新回到所属数据类型的最大或最小值,这与取模运算后数值会在有限范围内类似,取模运算除数为。
32位机器上,针对减法,设有整数m和n(m,n均大于0),的值根据取模原理实际可以写成以下形式:
以上等式可以描述为的补码 ( 的反码1 ),也就是m和n的补码相加。
举个例子:计算 的值。
1的补码为:
-1的反码为:
根据推导公式, ,此时。 在32位机器上的二进制表示如下:
-1的补码为:
根据推导公式,,。在32位机器上的二进制表示如下:
由于1的补码为其原码:
两数补码相加后得到值为0。
而正数加法则无需这种变化,原反补的值都相同。
2.3 整型类型与范围
类型 | 范围 |
---|---|
char | 0 ~ 127 |
signed char | -127 ~ 127 |
unsigned char | 0 ~ 255 |
short int | -32767 ~ 32767 |
unsigned short int | 0 ~ 65535 |
int | -32767 ~ 32767 |
unsigned int | 0 ~ 65535 |
long int | -2147483647 ~ 2147483647 |
unsigned long int | 0 ~ 429496 7295 |
3、浮点型在内存中的存储
先看一段代码,在该代码片段中,分别打印整数num的值与强转浮点型后的值。
int main()
{
int num = 5;
float* ptr_num = (float*)#
printf("num = %d\n", num);
printf("* ptr_num = %f", *ptr_num);
return 0;
}
运行结果如下:
按照我们的理解整数强转浮点型打印结果应该为5和5.0。然而打印结果并不一致,说明浮点型的存储与整型存储方式并不一样。
3.1 IEEE754标准
IEEE754二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。
该标准认为任意浮点数都可以表示为。
其中,为符号位 为正数, 为负数 ;
为有效数字,取值范围,在存储时只存储小数部分,如1.01只存储01,这样可以提高数据的精度;
为指数,标准规定以unsigned int 形式存储,由于可能为负数,所以标准规定存入内存时真实值需加上一个中间值,单精度浮点型中间值为127,双精度浮点型中间值为1023,如时单精度浮点型内存中存储的应为137,二进制形式。
当全为0时,则根据上述规则,该浮点数表示的是趋向于0的一个数,对于这种情况,标准规定有效数字不再还原第一位的1,而是还原为0.x...x的小数部分以此表示趋近于0的正负数。
当全为1时, 根据上述规则,该浮点数表示的是一个数趋向无穷大的一个数。
十进制与IEEE754标准转化:
5.0转化为IEEE754标准写作:
-5.0转化为IEEE754标准写作:
3.1.1 浮点型 内存存储
对于单精度浮点型,标准规定符号位占1bit,指数占8bit,有效数字占23bit。
对于双精度浮点型,标准规定符号位占1bit,指数占11bit,有效数字占52bit。
根据内存存储形式,再来看一下这段代码
int main()
{
int num = 5;
float* ptr_num = (float*)#
printf("num = %d\n", num);
printf("* ptr_num = %f", *ptr_num);
return 0;
}
num整数在二进制中的存储为:
将其强转为单精度浮点型后:
此时指数位E均为0,根据标准规定在浮点型中表示的就是一个无限趋近于0的数,所以呈现出的运行结果。