数据存储 IEEE754 with little and big endian
Data storage IEEE754 with little and big endian
我目前正在学习一些 IT 知识,并且有一个可能非常简单的问题..
我的任务是计算 4 个字节的内存转储的十进制输出,存储为小端 (IEEE754)。我的书只解释了当数据存储时如何处理这种计算:
|--------- Byte 1 --------|--------- Byte 2 -------------|--------- Byte 3 ------------|--------- Byte 4 ------|
|sign e7 e6 e5 e4 e3 e2 e1|e0 m22 m21 m20 m19 m18 m17 m16|m15 m14 m13 m12 m11 m10 m9 m8|m7 m6 m5 m4 m3 m2 m1 m0|
我没有任何关于 little/big endian 的有用描述......
我花了很多时间想通上面的 table 必须存储为 big endian。 little endian 的描述说第一个字节在第 4 个字节的位置,第二个在位置 3,第三个在位置 2,第四个在第一个地址。
Example:
Big endian: AB CD EF 01
Little endian: 01 EF CD AB
我说的对吗?
我现在有点困惑,因为这一定意味着例如数字符号位是 AB 字节的第一个,不是吗?
有人可以确认或解释以下 table 是否正确“转移”到小端:
|--------- Byte 1 ------|--------- Byte 2 ------------|--------- Byte 3 -------------|--------- Byte 4 --------|
|m7 m6 m5 m4 m3 m2 m1 m0|m15 m14 m13 m12 m11 m10 m9 m8|e0 m22 m21 m20 m19 m18 m17 m16|sign e7 e6 e5 e4 e3 e2 e1|
非常感谢!!!
您的解释完全正确。可以通过简单的程序轻松验证。
#include <stdio.h>
#include <string.h>
int main() {
float f=-123456.75f;
int i;
unsigned char c[4];
memcpy(c,&f,4);
memcpy(&i,&f,4);
printf("decimal representation of f: %f\n",f);
printf("hex representation of f: %a\n",f);
printf("hex value of integer with the same bytes as f: %x\n",i);
printf("sucessive bytes in f (0:3): %.2x %.2x %.2x %.2x\n",c[0],c[1],c[2],c[3]);
/* gives
decimal representation of f: -123456.750000
hex representation of f: -0x1.e240cp+16
hex value of integer with the same bytes as f: c7f12060
sucessive bytes in f (0:3): 60 20 f1 c7
*/
}
I’m slightly confused now, because this must mean that e.g. the bit for the sign of the number is the first one of the AB Byte, isn’t it?
没有理由混淆。在内存中,符号位确实是小端架构上浮点表示的第四个字节的 MSB。
但是字节序只涉及字节在内存中如何存储。无论字节顺序如何,一旦加载到寄存器中并由程序操作,行为将是相同的。
我们习惯于从左到右书写,并从最高位开始数字。但只要保留数学属性,其他表示方案也完全有效。
如果对你有帮助,就把最低有效位的字节写在左边(但在计算机上左右没有意义)。
|--------- Byte 1 ------|--------- Byte 2 ------------|--------- Byte 3 -------------|--------- Byte 4 --------|
|m0 m1 m2 m3 m4 m5 m6 m7|m8 m0 m10 m11 m12 m13 m14 m15|m16 m17 m18 m19 m20 m21 m22 e0|e1 e2 e3 e4 e5 e6 e7 sign|
我目前正在学习一些 IT 知识,并且有一个可能非常简单的问题.. 我的任务是计算 4 个字节的内存转储的十进制输出,存储为小端 (IEEE754)。我的书只解释了当数据存储时如何处理这种计算:
|--------- Byte 1 --------|--------- Byte 2 -------------|--------- Byte 3 ------------|--------- Byte 4 ------|
|sign e7 e6 e5 e4 e3 e2 e1|e0 m22 m21 m20 m19 m18 m17 m16|m15 m14 m13 m12 m11 m10 m9 m8|m7 m6 m5 m4 m3 m2 m1 m0|
我没有任何关于 little/big endian 的有用描述...... 我花了很多时间想通上面的 table 必须存储为 big endian。 little endian 的描述说第一个字节在第 4 个字节的位置,第二个在位置 3,第三个在位置 2,第四个在第一个地址。
Example:
Big endian: AB CD EF 01
Little endian: 01 EF CD AB
我说的对吗?
我现在有点困惑,因为这一定意味着例如数字符号位是 AB 字节的第一个,不是吗? 有人可以确认或解释以下 table 是否正确“转移”到小端:
|--------- Byte 1 ------|--------- Byte 2 ------------|--------- Byte 3 -------------|--------- Byte 4 --------|
|m7 m6 m5 m4 m3 m2 m1 m0|m15 m14 m13 m12 m11 m10 m9 m8|e0 m22 m21 m20 m19 m18 m17 m16|sign e7 e6 e5 e4 e3 e2 e1|
非常感谢!!!
您的解释完全正确。可以通过简单的程序轻松验证。
#include <stdio.h>
#include <string.h>
int main() {
float f=-123456.75f;
int i;
unsigned char c[4];
memcpy(c,&f,4);
memcpy(&i,&f,4);
printf("decimal representation of f: %f\n",f);
printf("hex representation of f: %a\n",f);
printf("hex value of integer with the same bytes as f: %x\n",i);
printf("sucessive bytes in f (0:3): %.2x %.2x %.2x %.2x\n",c[0],c[1],c[2],c[3]);
/* gives
decimal representation of f: -123456.750000
hex representation of f: -0x1.e240cp+16
hex value of integer with the same bytes as f: c7f12060
sucessive bytes in f (0:3): 60 20 f1 c7
*/
}
I’m slightly confused now, because this must mean that e.g. the bit for the sign of the number is the first one of the AB Byte, isn’t it?
没有理由混淆。在内存中,符号位确实是小端架构上浮点表示的第四个字节的 MSB。
但是字节序只涉及字节在内存中如何存储。无论字节顺序如何,一旦加载到寄存器中并由程序操作,行为将是相同的。
我们习惯于从左到右书写,并从最高位开始数字。但只要保留数学属性,其他表示方案也完全有效。
如果对你有帮助,就把最低有效位的字节写在左边(但在计算机上左右没有意义)。
|--------- Byte 1 ------|--------- Byte 2 ------------|--------- Byte 3 -------------|--------- Byte 4 --------|
|m0 m1 m2 m3 m4 m5 m6 m7|m8 m0 m10 m11 m12 m13 m14 m15|m16 m17 m18 m19 m20 m21 m22 e0|e1 e2 e3 e4 e5 e6 e7 sign|