在HEX和实数中写入整数之间的差异

问题描述 投票:-1回答:2

我在大学里接到一项任务,有一个数字,我需要用十六进制显示它,因为它在计算机上显示。我写了一个程序来翻译带符号的整数。我还在十六进制中找到了一个实数项。但这与通常的有所不同。

对于整数,我使用:printf("%#X", d);

对于真实,我使用:printf("%#lX", r);

如果我输入12,则首先打印:0xC

如果我输入12.0,则第二次打印:0x4028000000000000

您能解释一下差异和如何计算吗?

c floating-point hex
2个回答
2
投票

X格式说明符需要intunsigned int参数。使用l修饰符,它需要一个longunsigned long int参数。如果您用其他任何名称(例如double)调用它,则会得到不确定的行为。

如果要打印十六进制浮点数(带有大写字母),请使用%A格式,对于12.0,将打印0X1.8P+3-1½×2 3


0
投票

以十六进制产生数字的encoding是一个简单的内存转储。

下面通过对象的地址及其大小形成打印字符串。

#include <stdio.h>
#include <assert.h>
#include <limits.h>

//                                    .... compound literal ....................
#define VAR_TO_STR_HEX(x) obj_to_hex((char [(sizeof(x)*CHAR_BIT + 3)/4 + 1]){""}, &(x), sizeof (x))

char *obj_to_hex(char *dest, void *object, size_t osize) {
  const unsigned char *p = (const unsigned char *) object;
  p += osize;
  char *s = dest;
  while (osize-- > 0) {
    p--;
    unsigned i = (CHAR_BIT + 3)/4;
    while (i-- > 0) {
      unsigned digit = (*p >> (i*4)) & 15;
      *s++ = "0123456789ABCDEF"[digit];
    }
  }
  *s = '\0';
  return dest;
}

int main(void) {
  double d = 12.0;
  int i = 12;
  printf("double %s\tint %s\n", VAR_TO_STR_HEX(d), VAR_TO_STR_HEX(i) );
  d = -d;
  i = -i;
  printf("double %s\tint %s\n", VAR_TO_STR_HEX(d), VAR_TO_STR_HEX(i) );
  return 0;
}

输出

double 4028000000000000 int 0000000C
double C028000000000000 int FFFFFFF4

对于更复杂的对象,输出可能包括填充位/字节,并且输出对字节序敏感。

© www.soinside.com 2019 - 2024. All rights reserved.