6

我有这个十六进制数字:

呸呸呸呸

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

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,我需要比较两者。如果我做不到printf,那两个都sprintf行不通。

4

4 回答 4

9

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

只需使用:

unsigned long long temp = 0xffffffffffffull;

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

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

#include <stdint.h>

然后使用uint_least64_t评论中建议的类型。在 Linux 中,我猜您使用的是 GCC,所以您应该没问题,您可能需要指定您希望将代码编译为 C99(带有-std=c99)。

要打印它,请使用:

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

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

于 2013-05-08T13:09:00.293 回答
0

当您将值存储在 adouble中时,没有理智的方法可以获得十六进制输出。

您的代码传递 a doubletoprintf()并反复尝试将其格式化为 plain int; 这不会奏效。如果您在启用警告的情况下使用 GCC,您应该收到有关格式字符串和值之间不匹配的警告(如果您在未启用警告的情况下使用 GCC,请改用您的邪恶/懒惰方式并打开编译器警告 --Wall至少使用,并且可能-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;
}
于 2013-05-08T13:14:18.917 回答
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 
于 2014-01-13T23:02:35.150 回答
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 和其他奇怪的值会发生什么。

于 2018-04-18T20:34:56.040 回答