2013-03-11 54 views
-1

我在C類這部分代碼:顯示的整數爲十六進制用C

int i; 
    for (i=0;i<val;i++) 
     mdl_print ("%u ", rec->payload[i]); 
    mdl_print ("\n"); 

變量消遣>有效載荷是uint8_t類型。我會用十六進制打印它。

我該怎麼辦?謝謝。

+1

想必'mdl_print()'採用'printf()'採取的任何格式字符串? – Mike 2013-03-11 11:34:35

+0

是的;)我改寫爲我個人使用 – sharkbait 2013-03-11 11:48:26

+0

我不明白這個問題是如何保證倒票的。如何正確地將* uintN_t *轉換爲十進制數字的字符串並不清楚,正如這個問題的錯誤答案的數量所證明的那樣。讀過7.21.6.1 p8和p9的人有多少個答案?顯然,沒有。 – Sebivor 2013-03-11 12:19:56

回答

0

首先你的標題是錯的... Casting integer to hex in C鑄造意味着一個類型的變化,十六進制是一個數字系統而不是一個類型。你是「以十六進制顯示一個整數」而不是「投射」。如果您不瞭解差異,請要求澄清。

就顯示而言,它取決於你想要的結果。我通常使用一個捷徑是:

mdl_print("%#x ", rec->payload[i]); 

該款顯示器值:

0xA6 

這個語法需要注意的是,它不與0工作,你沒有得到0x0只是0。因此,一個替代方案是:

mdl_print("0x%x ", rec->payload[i]); 

這將顯示該值作爲0xA60x0也許不管它。當然,如果你不想讓0x部分,你可以永遠只是做:

mdl_print("%x ", rec->payload[i]); 

你最大值(十六進制)用8位無符號數爲0xFF,所以如果你希望它們都顯示相同的「寬」可以使用尺寸說明過:

mdl_print("%02x ", rec->payload[i]); // or mdl_print("0x%02x, rec->payload[i]); 
            // or whatever you picked 
2

快速簡單:

print("%x", (int)(rec->payload[i])); 

要在格式0×05顯示,然後使用:

print("0x%02x", ...) 

代替。

2

如果mdl_print()的工作方式類似於標準C函數printf(),你可以試試下面的:

printf("%02x", (int) rec->payload[i]); 

以十六進制編寫基本的printf格式代碼是%X。 「02」表示用'0'填充數字,直到它有兩個字符寬,這就是通常打印int8的方式。

許多自定義輸出函數都以這種方式遵循printf格式,因爲它對C程序員非常熟悉。你可以閱讀更多關於它的printf手冊頁:http://linux.die.net/man/3/printf

+0

'x'格式需要一個'unsigned int' – 2013-03-11 12:43:21

1

使用 「%X」,所以:

mdl_print( 「%X」,消遣 - >有效載荷[1]);

這會給你一個十六進制數字,即「必要的長度」。如果你想要一個固定的長度,用「%02x」填充兩個用零填充的數字。

+0

參數應該顯式轉換爲'unsigned int',如果它的功能類似於標準C中的格式化打印:'mdl_printf(「%x」,(unsigned int)rec - >有效載荷[I]);'。 n1570.pdf的7.21.6.1p8中的證明:「unsigned int參數轉換爲...無符號十六進制表示法(x或X)」。 – Sebivor 2013-03-11 11:58:29

1

注意,這裏提供的unsigned int printf中,預計一uint8_tint是不確定的行爲,如n1570.pdf第7.21.6.1p9說:「如果任何參數不是相應轉換規範的正確類型,則爲行爲沒有定義。「根據7.21.6.1p8,%x告訴printf期望unsigned int。確保您明確地將uint8_t轉換爲(unsigned int),或使用<stdint.h>中的PRIx8宏。

#include <assert.h> 
#include <stdint.h> 
#include <stdio.h> 

int main(void) { 
    uint8_t foo = 42; 
    /* These two printfs are equivalent: */ 
    printf("Hex for %02u: %02x\n", (unsigned int) foo, (unsigned int) foo); 
    printf("Hex for %02" PRIu8 ": %02" PRIx8 "\n", foo, foo); 
    return 0; 
} 
+0

閱讀同一文檔的第7.20節(整數類型)。 'uint8_t' *是一個有效的整數類型,因此不會*導致UB – Mike 2013-03-11 12:30:37

+0

@Mike,因爲這樣一個'unit8_t'被轉換爲'int'而不是無符號的,所以'可修改的左值'是糾正一個人應該照顧這一點。 – 2013-03-11 12:41:49

+0

@JensGustedt好的,你可以修改左值,然後再解釋一下。 7.21.6 p8表示'x'採用'unsigned int'參數。 7.20.1.1(2&3)指出typedef名稱爲'uintN_t'指定一個unsigned int類型,並且實現提供8位作爲其中一個寬度。那麼uint8_t是不是一個unsigned int?注意到轉換爲signed int的位置在哪裏?並且明確的類型轉換解決了這個問題?用於隱式轉換的 – Mike 2013-03-11 12:57:34

相關問題