我正在运行一个用于学习C的测试代码。但是我对负数的十六进制表示法感到好奇,为此我编写了一个测试代码。令我惊讶的是,通过运行测试代码,我只收到0

    union unin
    {
        char chrArray[4];
        float flotVal;
    }uninObj;

    uninObj.flotVal = -25;

    printf("%x %x %x %x",uninObj.chrArray[0], uninObj.chrArray[1], /
           uninObj.chrArray[2], uninObj.chrArray[3]);
    printf("\n Float in hex: %x",uninObj.flotVal);
    return 0;

最佳答案

float传递给期望unsigned int的说明符是未定义的行为。
此外,unsigned int所期望的%x不能保证与float相同的大小。因此,以这种方式欺骗printf的企图可能会也可能不会“奏效”。
无论如何,对于一个变量函数,比如printf,编译器将把float类型的参数提升为double,所以这可能是您(和我)获得0输出的原因。
在我的系统上
sizeof(double)是指8
sizeof(unsigned int)是指4
如果你看一下union那部分的字节输出,前两个是0。因此,在将8个字节传递给函数而不是%x所期望的4个字节之后,数据的对齐方式是%x得到4个0值字节。

10-06 14:37