微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C中浮点数的字节数

如何解决C中浮点数的字节数

我正在阅读《计算机系统:程序员的观点》(Bryant & O'Hallaron)。 在第 2 章图 2.4 中显示了以下代码

#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start,int len){
  int i;
  for(i = 0; i < len; i++)
    printf(" %.2x",start[i]);
  printf("\n");
}

void show_int(int x){
  show_bytes((byte_pointer) &x,sizeof(int));
}

void show_float(float x) {
  show_bytes((byte_pointer) &x,sizeof(float));
}

void show_pointer(void *x){
  show_bytes((byte_pointer) &x,sizeof(void *));
}

图 2.4 打印程序对象字节表示的代码。此代码使用 强制转换以绕过类型系统。很容易为其他数据定义类似的函数 类型

然后使用下面的方法

void test_show_bytes(int val) {
int ival = val;
float fval = (float) ival;
int *pval = &ival;
show_int(ival);
show_float(fval);
show_pointer(pval);
}

根据书上的说法,如果值为12345,这个测试方法应该在linux 64上打印以下内容

39 30 00 00
00 e4 40 46
b8 11 e5 ff ff 7f 00 00

但是当我运行代码时,我得到以下结果

39 30 00 00
00 00 00 00
d8 d6 54 c3 fd 7f 00 00

我使用的是 gcc 版本 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 我运行的代码基于书中的示例 我对 C 很陌生,有什么想法为什么我的结果不同吗?

#include <stdio.h>

typedef unsigned char *byte_pointer;

nt main(){
  int val =  12345;
  test_show_bytes(val);
}

void test_show_bytes(int val) {
  int ival = val;
  float fval = (float) ival;
  int *pval = &ival;
  show_int(ival);
  show_float(fval);
  show_pointer(pval);
}


void show_bytes(byte_pointer start,sizeof(void *));
}

解决方法

show_float(fval); 在看到 show_float(float x) 的函数定义之前使用 - 一个禁忌。不要那样做。启用所有编译器警告以提高工作效率。

编译器猜测定义为 show_float(double x),因此在 show_float(fval); 调用期间传递了错误的信息。

,

谢谢,解决了。

是的,我收到了很多关于隐式声明函数和冲突类型的警告。 我对错误级别日志下的任何内容几乎视而不见,我的错。 我将检查默认参数提升在 C 中的含义 把函数声明按顺序解决了这个问题。一开始我只是猜到了main函数的位置。愚蠢的猜测,我之前只在 OOP 语言中使用过 main(),应该阅读文档。

#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start,int len){
  int i;
  for(i = 0; i < len; i++)
    printf(" %.2x",start[i]);
  printf("\n");
}

void show_int(int x){
  show_bytes((byte_pointer) &x,sizeof(int));
}

void show_float(float x) {
  show_bytes((byte_pointer) &x,sizeof(float));
}

void show_pointer(void *x){
  show_bytes((byte_pointer) &x,sizeof(void *));
}

void test_show_bytes(int val) {
  int ival = val;
  float fval = (float) ival;
  int *pval = &ival;
  show_int(ival);
  show_float(fval);
  show_pointer(pval);
}

int main(){
  int val =  12345;
  test_show_bytes(val);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。