我正在学习C,部分是为了习惯指针,部分是为了了解IEEE 754浮动,我try 了以下操作:

#include <stdio.h>

int main() {

    float f1 = -12.78;
    const char *p =  (char *)&f1;
    for(int i=0; i < sizeof(f1); i++) {
        printf("i: %i and p: %p and byte is %#x\n",i,p,*p);
        p++;
    }
}

我没有收到任何警告或错误(与我之前try 过的大多数版本不同!),但我确实得到了奇怪的结果:

i: 0 and p: 0x16ce13368 and byte is 0xffffffe1
i: 1 and p: 0x16ce13369 and byte is 0x7a
i: 2 and p: 0x16ce1336a and byte is 0x4c
i: 3 and p: 0x16ce1336b and byte is 0xffffffc1

我对IEEE 754的(有限)理解是-12.78确实是以字节为单位的e1 7a 4c c1,但为什么第一个字节显示为ff ff ff e1(最后一个字节也是如此)?

有更好的方法吗?

我还try 使用char数组,但没有取得太大进展.我还try 使用val *p来访问保存float的内存,但也无法让它发挥作用.

推荐答案

因为char在print中使用时被签名并升级为int.这就是为什么您会看到那些负的int数字打印为十六进制.

使用unsigned type和正确的格式

int main() {

    float f1 = -12.78;
    const unsigned char *p =  (const unsigned char *)&f1;
    for(int i=0; i < sizeof(f1); i++) {
        printf("i: %i and p: %p and byte is %hhx\n", i, (void *)p,*p);
        p++;
    }
}

C++相关问答推荐

MISIX标准和信号量的语义

根据工具链文件中的定义替换单个函数定义

为什么信号量为空= 0,而不是阻塞?

在C中使用动态内存分配找到最小的负数

我无法让LLDB正确运行我的可执行文件

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

平均程序编译,但结果不好

防止规范模式在C++中 echo 特殊字符

C指针概念分段故障

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

C将数组传递给函数以修改数组

如何将C中的两个字符串与从文件接收的字符串中的字符数进行比较

错误:字符串在C中获得意外输出

如何在C中定义指向函数的指针并将该指针赋给函数?

挥发性语义的形式化理解

为什么argc和argv即使在主函数之外也能工作?

如何使crc32的结果与cksum匹配?

C 语言中 CORDIC 对数的问题

与 C 相比,C++ 中无副作用的无限循环的好处是 UB?