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

时间:2013-05-08 13:04:59

标签: c linux unix hex

我的这个数字是十六进制的:

  

FFFFFFFFFFFF

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

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

有了这个,我需要从十六进制变为字符串,比较它,因为我也在字符串中有FFFFFFFFFFFF,我需要比较两者。如果我不能printfsprintf也不会有效。

4 个答案:

答案 0 :(得分:8)

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

只需使用:

unsigned long long temp = 0xffffffffffffull;

您有12个十六进制数字,因此您的数字至少需要12 * 4 = 48位。大多数平台应该有64位的unsigned long long,这应该没问题。

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

#include <stdint.h>

然后按照评论中的建议使用uint_least64_t类型。在Linux中我猜你正在使用GCC所以你应该没问题,你可能需要指定你打算将你的代码编译为C99(-std=c99)。

要打印它,请使用:

printf("temp=%llx\n", temp);

另请注意,值本身不是十六进制,但您可以将打印为十六进制。该值只是一个值,只有在转换为/从文本转换时,基数才重要,即数字的外部表示。在二进制计算机内部,数字以二进制形式存储。

答案 1 :(得分:0)

当您将值存储在double中时,没有理智的方法来获取十六进制输出。

您的代码将double传递给printf(),并反复尝试将其格式化为普通int;这不会很好。如果您使用GCC并启用了警告,那么您应该收到有关格式字符串和值之间不匹配的警告(如果您在未启用警告的情况下使用GCC,请重复您的邪恶/懒惰方式并打开编译器警告 - 使用-Wall at至少,也可能是-Wextra,并修复任何结果警告。)

值为12 F,因此它是long long值(或unsigned 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;
}

答案 2 :(得分: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 

答案 3 :(得分:0)

一个老问题,但我认为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");

结果输出为:

sizeof(dbl) = 8
3.141593
EA2E4454FB210940

要读入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);

输出结果为:

EA2E4454FB210940
3.141593

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