c - %c specifier char limit capped in C,如何避免这种情况?

标签 c arrays char character limit

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

基本上,使用以下代码:

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 时,我的程序崩溃了。

我曾尝试将数组复制到另一个数组,不幸的是没有用。

最佳答案

OP 评论:

expected output is something along the lines of 222.74bc6a7ef9d...

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

为了更高精度的使用,double

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

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

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

关于c - %c specifier char limit capped in C,如何避免这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35281929/

相关文章:

c - c中的malloc链表

c - C编程中需要什么时候初始化变量

有人可以帮我 C

C 将文字 char '0' 转换为 int 0(零),如何?

c++ - 从 char * C++ 中删除项目

c - 将数组设置为一个值

cocoa - 从 NSArray 获取 NSIndexSet

javascript - 使用两个值作为一个值的键

c# - 在文本文件中读取更多 'intelligently'

c - scanf 加载 struct -> char[] 的问题