【问题标题】:%c specifier char limit capped in C, how to avoid that?%c 说明符字符限制在 C 中,如何避免这种情况?
【发布时间】:2016-02-09 00:32:43
【问题描述】:

我在尝试输出十六进制数的小数部分时遇到了问题。

基本上,使用以下代码:

float d2h(float decimal, float fraction) {
  int i = 0;
  char hex[17] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                   'A', 'B', 'C', 'D', 'E', 'F', '\0' };
  int temp = (int) decimal;
  int j;
  for (j = 0; j < 60; j++) {
    fraction = fraction - (int) fraction;
    displayFractionHex[j] = hex[(int) (fraction * 16)];
    fraction *= 16;
  }
  for (i = sizeof(displayDecimalHex) - 1; i >= 0; i--) {
    displayDecimalHex[i] = hex[temp % 16];
    temp /= 16;
  }
  int n;
  if ((n = strspn(displayDecimalHex, "0")) != 0
      && displayDecimalHex[n] != '\0')        // strspn() - Reference
    printf("%s", &displayDecimalHex[n]);
  printf(".");
  for (i = 0; i < 20; i++) {
    printf("%c", displayFractionHex[i]);
  }
}

我得到了输出222.74BC0000000000000000,我显然希望十六进制数的小数部分显示更多字符。

但是,当我尝试将最后一个 printf 语句更改为 %s 说明符而不是 %c 时,我的程序崩溃了。

我尝试将数组复制到另一个数组,但不幸的是无济于事。

【问题讨论】:

  • 您的意见是什么? displayFractionHexdisplayDecimalHex 声明在哪里?
  • char displayDecimalHex[30], displayFractionHex[30]; -- 在代码的最顶部。
  • 我的输入是一个浮点数,然后分成小数部分和小数部分
  • 你传递了哪两个浮点数到这个函数来得到上面的输出,你期望的输出是什么?
  • 好吧,我的输入是 546.456,因此十进制浮点数是 546,小数浮点数是 0.456

标签: c arrays char character limit


【解决方案1】:

OP 评论:

预期输出类似于 222.74bc6a7ef9d...

典型的 float222.74BC000000..." 一样具有大约 24 位二进制精度。

如需更高精度使用,请double

例如使用printf("%a\n%a\n", (float) 546.456, 546.456); 来查看差异。

0x1.113a5ep+9
0x1.113a5e353f7cfp+9

需要明确的是,“因此十进制浮点数为 546,小数浮点数为 0.456”是不正确的。 d2h(float decimal) 的输入不是 546.456,但最接近的可表示float 正好是546.4559936523437500...那个 float 正好是222.74BC十六进制 FP。

【讨论】:

  • 但是,它现在显示 222.74BC6A7EF9E000000000 -- 有没有办法让它显示更多字符?
  • @zorrooo long double?请注意,546.456 到 FP 通常不会确切地为您提供 546.456,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多