我的这个数字是十六进制的:
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,我需要比较两者。如果我不能printf
,sprintf
也不会有效。
答案 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和其他奇怪的值会发生什么。