我在大学里接到一项任务,有一个数字,我需要用十六进制显示它,因为它在计算机上显示。我写了一个程序来翻译带符号的整数。我还在十六进制中找到了一个实数项。但这与通常的有所不同。
对于整数,我使用:printf("%#X", d);
对于真实,我使用:printf("%#lX", r);
如果我输入12
,则首先打印:0xC
如果我输入12.0
,则第二次打印:0x4028000000000000
您能解释一下差异和如何计算吗?
X
格式说明符需要int
或unsigned int
参数。使用l
修饰符,它需要一个long
或unsigned long int
参数。如果您用其他任何名称(例如double
)调用它,则会得到不确定的行为。
如果要打印十六进制浮点数(带有大写字母),请使用%A
格式,对于12.0,将打印0X1.8P+3
-1½×2 3
以十六进制产生数字的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
对于更复杂的对象,输出可能包括填充位/字节,并且输出对字节序敏感。