我在C類這部分代碼:顯示的整數爲十六進制用C
int i;
for (i=0;i<val;i++)
mdl_print ("%u ", rec->payload[i]);
mdl_print ("\n");
變量消遣>有效載荷是uint8_t類型。我會用十六進制打印它。
我該怎麼辦?謝謝。
我在C類這部分代碼:顯示的整數爲十六進制用C
int i;
for (i=0;i<val;i++)
mdl_print ("%u ", rec->payload[i]);
mdl_print ("\n");
變量消遣>有效載荷是uint8_t類型。我會用十六進制打印它。
我該怎麼辦?謝謝。
首先你的標題是錯的... Casting integer to hex in C
鑄造意味着一個類型的變化,十六進制是一個數字系統而不是一個類型。你是「以十六進制顯示一個整數」而不是「投射」。如果您不瞭解差異,請要求澄清。
就顯示而言,它取決於你想要的結果。我通常使用一個捷徑是:
mdl_print("%#x ", rec->payload[i]);
該款顯示器值:
0xA6
這個語法需要注意的是,它不與0工作,你沒有得到0x0
只是0
。因此,一個替代方案是:
mdl_print("0x%x ", rec->payload[i]);
這將顯示該值作爲0xA6
或0x0
也許不管它。當然,如果你不想讓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
快速簡單:
print("%x", (int)(rec->payload[i]));
要在格式0×05顯示,然後使用:
print("0x%02x", ...)
代替。
如果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
'x'格式需要一個'unsigned int' – 2013-03-11 12:43:21
使用 「%X」,所以:
mdl_print( 「%X」,消遣 - >有效載荷[1]);
這會給你一個十六進制數字,即「必要的長度」。如果你想要一個固定的長度,用「%02x」填充兩個用零填充的數字。
參數應該顯式轉換爲'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
注意,這裏提供的unsigned int
printf中,預計一uint8_t
或int
是不確定的行爲,如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;
}
閱讀同一文檔的第7.20節(整數類型)。 'uint8_t' *是一個有效的整數類型,因此不會*導致UB – Mike 2013-03-11 12:30:37
@Mike,因爲這樣一個'unit8_t'被轉換爲'int'而不是無符號的,所以'可修改的左值'是糾正一個人應該照顧這一點。 – 2013-03-11 12:41:49
@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
想必'mdl_print()'採用'printf()'採取的任何格式字符串? – Mike 2013-03-11 11:34:35
是的;)我改寫爲我個人使用 – sharkbait 2013-03-11 11:48:26
我不明白這個問題是如何保證倒票的。如何正確地將* uintN_t *轉換爲十進制數字的字符串並不清楚,正如這個問題的錯誤答案的數量所證明的那樣。讀過7.21.6.1 p8和p9的人有多少個答案?顯然,沒有。 – Sebivor 2013-03-11 12:19:56