如何在C中打印十六进制双精度?

如何在C中打印十六进制双精度?,c,linux,unix,hex,C,Linux,Unix,Hex,我有十六进制的数字: FFFFFFFFFF 我需要保存它,所以我用了双倍 double a=0xffffffffffff; 但是我需要打印出来,我不知道怎么打印。每次我使用%f,%d,%x,它都不会打印它的值;我只需要打印ffffffffffff。我的代码: int main() { double a=0xffffffffffff; printf("%x\n",a); printf("%d\n",a); printf("%X\n",a); printf(

我有十六进制的数字:

FFFFFFFFFF

我需要保存它,所以我用了双倍

double a=0xffffffffffff;
但是我需要打印出来,我不知道怎么打印。每次我使用
%f
%d
%x
,它都不会打印它的值;我只需要打印
ffffffffffff
。我的代码:

int main()
{
    double a=0xffffffffffff;
    printf("%x\n",a);
    printf("%d\n",a);
    printf("%X\n",a);
    printf("%f\n",a);
    return 0;
}
唯一的真值是
%f
;返回十六进制的十进制值-它返回以下内容:

 ffffffe0
 -32 
 FFFFFFE0
 281474976710655.000000

有了这个,我需要从十六进制改为字符串,来比较它,因为字符串中也有ffffffffff,我需要比较两者。如果我不能
printf
它,那么
sprintf
也不能工作。

这是一个整数,也是一个长整数。不要使用
double
来存储这样的值,这是浮点值

只需使用:

unsigned long long temp = 0xffffffffffffull;
您有12个十六进制数字,因此您的数字至少需要12*4=48位。大多数平台应该有一个64位的
无符号long
,这应该可以

如果您的编译器受支持程度足以支持C99,则可以执行以下操作:

#include <stdint.h>

还请注意,该值本身不是十六进制的,但您可以将其打印为十六进制。该值只是一个值,只有在与文本(即数字的外部表示形式)进行转换时,基数才起作用。在二进制计算机内部,数字是以二进制形式存储的。

当您将值存储在
双精度
中时,没有合理的方法获得十六进制输出

您的代码将一个
double
传递给
printf()
,并反复尝试将其格式化为普通
int
;这是行不通的。如果在启用警告的情况下使用GCC,您应该会收到关于格式字符串和值之间不匹配的警告(如果在未启用警告的情况下使用GCC,请改掉您的邪恶/懒惰方式,至少打开编译器警告-使用
-Wall
,可能还打开
-Wextra
,并修复所有产生的警告)

该值为12 F,因此为
long-long
值(或
无符号long-long
);储存并按如下方式处理:

int main()
{
    unsigned long long a = 0xFFFFFFFFFFFF;
    printf("%llx\n", a);
    printf("%lld\n", a);
    printf("%llX\n", a);
    printf("0x%llX\n", a);
    return 0;
}

在另一种情况下,他的问题是正确的。假设您想以十六进制打印
pow()
函数的输出-我现在刚刚遇到一个

printf( "pow(a, b) is : %f\n", pow(a, b) );  //Will give decimal value 
printf( "pow(a, b) is : %X\n", pow(a, b) );  //Not allowed 
我也是

unsigned long long int temp; 
temp = pow(a, b); 
printf( "pow(a, b) is : %X\n", temp);       //Will give hexadecimal value 

这是一个老问题,但我认为OP试图得到一个双精度和双精度的十六进制字符串表示

如果是这样,下面是一些代码:

union {
    double dbl;
    uint8_t i8[sizeof(double) + 1];
} buf;

printf("sizeof(dbl) = %ld\n", sizeof(double));
memset(buf.i8, 0x00, sizeof(buf.i8));
buf.dbl = 3.14159265359;
printf("%f\n", buf.dbl);
for(int i = 0; i < (int) sizeof(buf.i8) - 1; ++i) {
    printf("%02X", buf.i8[i]);
}
printf("\n");
要读入16个字符的字符串并获取双回码,请执行以下操作:

const char* str = "EA2E4454FB210940";
int j = 0;
for (int i = 0; i < (int) strlen(str); i += 2) {
    uint8_t val = 0;
    for (int k = 0; k < 2; ++k) {
        char ch = str[i + k];

        val *= 16;
        if (ch >= '0' && ch <= '9') {
            val += ch - '0';
        } else if (ch >= 'A' && ch <= 'F') {
            val += ch - 'A' + 10;
        }
    }
    buf.i8[j++] = val;
}

for(int i = 0; i < (int) sizeof(buf.i8) - 1; ++i) {
    printf("%02X", buf.i8[i]);
}
printf("\n");

printf("%f\n", buf.dbl);

请注意,这是在OSX上,不同的平台可能不具有相同的二进制表示形式。另外,不确定NaN和其他奇怪的值会发生什么情况。

好的,谢谢!,它与无符号长数组不同,对吗?为什么推荐
unsigned long
而不是
uint\u least64\u t
sizeof(dbl) = 8
3.141593
EA2E4454FB210940
const char* str = "EA2E4454FB210940";
int j = 0;
for (int i = 0; i < (int) strlen(str); i += 2) {
    uint8_t val = 0;
    for (int k = 0; k < 2; ++k) {
        char ch = str[i + k];

        val *= 16;
        if (ch >= '0' && ch <= '9') {
            val += ch - '0';
        } else if (ch >= 'A' && ch <= 'F') {
            val += ch - 'A' + 10;
        }
    }
    buf.i8[j++] = val;
}

for(int i = 0; i < (int) sizeof(buf.i8) - 1; ++i) {
    printf("%02X", buf.i8[i]);
}
printf("\n");

printf("%f\n", buf.dbl);
EA2E4454FB210940
3.141593