如何在C中打印十六进制双精度?
我有十六进制的数字: FFFFFFFFFF 我需要保存它,所以我用了双倍如何在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(
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