大端小端,浮点数内存表示

1.

设数据为01020304H,在内存中以如下方式表示为大端(高数据字节放低地址,反之为小端)。

01 02 03 04

低地址---------------------------------->高地址

2.

float IEEE标准是:(尾符1位)+(阶码8位)+(23位尾数)

<1>:阶码8位从-127~128,但实际上是把每个初始阶码加上127改为从0~255,输出是减去127.

<2>:假设数为0.101,先改为1.01保持整数位为1(规定),但尾数中把1隐藏了不存储,尾数为01,只是在输出是在加上1,23位实际是24了。

1.测试pc大端还是小端
#include<iostream>
using namespace std;

int main() {
	//字符串
	const char *p1 = "CU AND ALU";
	for (int i = 0; i < 10; ++i)
		cout << p1[i];
	cout << endl;
	//整数
	long long int i = 0x0102030405060708;
	char *p2 = (char *)&i;//char和int指针指向同一个内存单元,但位移量不同
	for (int i = 0; i < 8; ++i)
		cout << (int)p2[i] << ' ';
	cin.get();
	return 0;
}
---------------output
CU AND ALU
8 7 6 5 4 3 2 1
Conclusion:字符串以大端方式存放,整数以小端方式存放。

2.查看浮点数在内存中的形式。
#include<iostream>
using namespace std;

int main() {
	float num = 1.0;
	char*p = (char *)&num;
	cout <<(int)p[2]<<endl;
	printf("1.0的存储格式:%x %x %x %x\n", p[0], p[1], p[2], p[3]);
	num = 0.625;
	printf("0.625的存储格式:%x %x %x %x\n", p[0], p[1], p[2], p[3]);
	
	cin.get();
	return 0;
}
--------------------------output
-128
1.0的存储格式:0 0 ffffff80 3f
0.625的存储格式:0 0 20 3f
Conclusion:
<1>:1.0的输出中出现ffffff80,并不是一个字节,推测是在char以16进制输出时,会拓展为4个字节,高位按符号位填充,故全1.

<2>:0.625D=0.101B=1.01*e-1(隐藏位为1),尾数为01,阶码为-1+127=126
即:3f,20,00,00H,输出结果为0 0 20 3f,说明float以小端方式存放

猜你喜欢

转载自blog.csdn.net/qq_41033241/article/details/88539257