我写了以下代码:
void union_bytes() {
float fnum = 1209.1996f;
union endian {
float fnum;
int inum;
unsigned char cnum[4];
}instance;
instance.fnum = fnum;
printf("Number = %f\nLittle Endian = %.2x %.2x %.2x %.2x\nHex = %x\n", instance.fnum, instance.cnum[0],
instance.cnum[1], instance.cnum[2], instance.cnum[3], instance.inum);
}
void pointer_bytes() {
float fnum = 1209.1996f;
int *ptr_inum = (int*)&fnum;;
unsigned char *cbytes = (unsigned char *)&fnum;
printf("Number = %f\nLittle Endian = %.2x %.2x %.2x %.2x\nHex = %x\n", fnum, cbytes[0], cbytes[1], cbytes[2], cbytes[3], *ptr_inum);
}
我想知道,为什么我要做这样的事情:int *ptr_inum = (int*)&fnum;
以获得小端,我不能这样做:
int inum = (int)fnum;
我想,最后一个选项强制fnum丢失一些字节,但我仍然不知道这些数字在内存中是如何表示的(以及哪些字节确实丢失)。
为什么在这种情况下:
unsigned char ch[4] = { 0x3b, 0x51, 0x7a, 0x24 };
float f = *(float*)ch;
当进行转换时,ch不会给出第一个nible 0x3b,然后它是一个浮点数,而不是转换表中的所有字节,从而复合整个浮点数。
由于
答案 0 :(得分:0)
为什么我必须做这样的事情:int ptr_inum =(int )& fnum;为了 得到小端,我不能这样做:int inum = (INT)FNUM;
这里有一些术语混淆。 Little-endian是多字节结构的特定字节顺序,通常被提及而不是big-endian。
执行第一个声明的结果是: 使指向整数的变量指向存储浮点数的位置,以便稍后可以通过int检索/修改其单词表示。比如,对于符合IEEE-754标准的实现is represented as 0x3ff33333中的数字1.9,所以在小端架构上,如果你的int是32位,你将获得0x3ff33333。
第二个声明意味着:给我一个整数变量,它是一个浮点数。按标准来说,这意味着丢弃小数,因此从1.9开始,你将得到1。