2013-05-08 80 views
2

我有這個數字以十六進制:如何在C中打印十六進制雙精度?

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也不會工作。

回答

7

這是一個整數,長整數。不要使用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); 

還要注意的是,值本身是不是十六進制,但你可以打印十六進制。值只是一個值,只有在轉換爲文本時纔是基礎,也就是數字的外部表示。在二進制計算機內部,該數字以二進制形式存儲。

+0

感謝我要去嘗試用無符號長長:) – 2013-05-08 13:13:22

+0

確定它的工作原理,謝謝!它與無符號長多頭排列正確的有什麼不同? – 2013-05-08 13:24:18

+2

爲什麼推薦'unsigned long long'而不是'uint_least64_t'? – 2013-05-08 13:48:56

0

雖然將值存儲在double中,但獲取十六進制輸出沒有理智的方法。

您的代碼將double傳遞到printf()並重復嘗試將其格式化爲普通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; 
} 
1

在另一個上下文中,他的問題是有效的。假設你想以十六進制打印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