【问题标题】:how to convert a binary string into two's complement and IEEE in C如何在C中将二进制字符串转换为二进制补码和IEEE
【发布时间】:2015-04-19 18:57:28
【问题描述】:

所以我的任务是编写一个程序,该程序扫描来自用户的两个 32 字符的二进制字符串,这些字符串的长度始终为 32 个字符。在读入数字后,我应该询问用户他们希望字符串以二进制补码或 IEEE 浮点格式表示的格式。字符串的格式将决定字符串的数值。之后,它将用于一个简单的数学问题,并分别转换为八进制、十进制和十六进制。

我不确定的是如何将 32 个字符的字符串分别转换为二进制补码和 IEEE 浮点数。我已经尝试查找如何做到这一点,但所有的解释都超出了我对 C 的理解(这对我来说相对较新)。

这是一个示例二进制字符串,在其各自的表示中:

二进制字符串:01000000010010001111010111000011

格式:(Int) 表示二进制补码,或 (Float) 表示浮点数。

二进制补码表示:1078523331

浮点表示:3.14

【问题讨论】:

  • 看起来像家庭作业。你尝试了什么?
  • 我向教授请教了它的额外工作,因为我对 C 没有深入的了解。但我尝试将二进制 0 交换为 1,反之亦然,计算 1,然后做(2^i) 基于交换后有多少个 1。
  • IEEE 是一个专业协会:电气和电子工程师协会 (ieee.org)。您无法轻松地将二进制字符串转换为电气和电子工程师学院。

标签: c string binary floating-point


【解决方案1】:

如何解释二进制值是表示的职责,而不是您如何存储值本身。

我的意思是,一旦你有了一个 32 位的二进制值,你就不需要“转换”它,你需要根据特定的编码来解释它。

将值存储在类型适当的变量中就足以满足您的目的。因此,如果您将此值直接存储在 float 变量中(假设为 sizeof(float) == 4)将根据 IEEE 等产生正确的解释。

【讨论】:

  • 好的,但是将二进制值存储在 Int 中也适用于二进制补码吗?
  • 因为int 已经被解释为二进制补码,所以是的。总是假设sizeof(int) == 4,否则你需要用符号位填充高位。
  • 但是当你将它分配给“float”或“int”时,它只会改变原点的值。二进制值为 0。
【解决方案2】:

使用strtol(...,..., 2) 将“二进制字符串”转换为long。将生成的 longfloat 联合并打印所需的格式。

打印float 时,一定要以足够的精度打印以提供有意义的结果:"%f" 不行。

#include <float.h>
#ifndef FLT_DECIMAL_DIG
#define FLT_DECIMAL_DIG 9
#endif

void display(const char *binary_string, char mode) {
  union {
    long i;
    float f;
  } u;
  errno = 0;
  char *endptr;
  u.i = strtol(binary_string, &endptr, 2);
  if (errno || endptr == binary_string) {
    printf("Bad binary string '%s'\n", binary_string);
  }
  switch (mode) {
    case 'I' : printf("32-bit 2's %ld\n", u.i); break;
    case 'F' : printf("float      %.*e\n", FLT_DECIMAL_DIG - 1, u.f); break;
    default: printf("Bad mode '%c'\n", mode);
  }
}


display("01000000010010001111010111000011", 'I'); // 1078523331
display("01000000010010001111010111000011", 'F'); // 3.14000010e+00

假设:sizeof(long) == sizeof(float).

【讨论】:

  • 在“Display”中我们传递的“Const Char”变量是什么?
  • @Shika 查看答案的下半部分以获取示例:“二进制字符串”display("01000000010010001111010111000011", 'I')
  • 我尝试了您提供的上述代码,但一直收到有关“FLT_DECIMAL_DIG 9”未声明的错误,所以我只是将它作为浮点数硬编码到“显示”方法中。我还遇到格式(模式)无法正确显示的问题,我通过一组两个 if 语句将其传递给 display 方法,这些语句以正确的格式调用“display”方法。但是当我运行它时,它会自动显示格式“错误”并给我一组字符。如果您不介意看一下,我将提供我编写的代码。
  • @Shika 将您的附加信息附加到您的帖子中。
  • @Shika BTW:您对 FLT_DECIMAL_DIG 的麻烦令人担忧。现在,只需使用case 'F' : printf("float %.*e\n", 9 - 1, u.f); break;
猜你喜欢
  • 2016-07-16
  • 1970-01-01
  • 2016-08-31
  • 2021-02-24
  • 1970-01-01
  • 2021-05-16
  • 2013-09-28
相关资源
最近更新 更多