差异法线施法和指针施放

时间:2015-10-15 20:09:59

标签: pointers casting

我写了以下代码:

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,然后它是一个浮点数,而不是转换表中的所有字节,从而复合整个浮点数。

由于

1 个答案:

答案 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。