![](/img/trans.png)
[英]Why does this code for incrementing an uint8_t include `& 0xFF`?
[英]Why does converting string to hex need to be done with 0xff in C?
在這個問題之后如何在 c 中將字符串轉換為十六進制,反之亦然? ?
我運行以下代碼:
#include <stdio.h>
int main (int argc, char *argv[])
{
char str[] = { 0x58, 0x01, 0x02, 0x20, 0x22, 0x00, 0xC5};
char hex[32] = {0}, hex2[32] = {0};
for (int i = 0; i < sizeof(str); i++) {
sprintf(hex + i*2, "%02X", str[i]);
}
for (int i = 0; i < sizeof(str); i++) {
sprintf(hex2 + i*2, "%02X", str[i] & 0xff);
}
printf("hex = %s\nhex2 = %s\n", hex, hex2);
return 0;
}
我得到這個結果:
hex = 580102202200FFFFFFC5
hex2 = 580102202200C5
我想知道為什么沒有 0xFF 會有更多的FFFFFF
?
拼圖中有許多小塊需要拼湊起來。
首先,如果char
是有符號的或無符號的,它是實現定義的。
如果它是有符號的,那么由於常見的二進制補碼,值0xc5
實際上將是負數(它將是十進制值-59
)。
當一個小的 integer 類型(如char
)用作變量參數 function 的參數時,如sprintf
,那么它將被提升為int
。 如果類型是有符號的並且值為負,它將被符號擴展。 因此,假設是普通的 32 位int
,帶符號的負值0xc5
將被提升並符號擴展為0xffffffc5
。
要解決這個問題,最簡單的解決方案是簡單地使用顯式無符號類型,如uint8_t
(它基本上是unsigned char
的別名)。
除此之外,我還建議您使用hh
格式類型前綴來明確說明參數是一個字節。
放在一起改成
uint8_t str[] = { 0x58, 0x01, 0x02, 0x20, 0x22, 0x00, 0xC5};
和
sprintf(hex + i*2, "%02hhX", str[i]);
至於str[i] & 0xff
的區別,那是因為你屏蔽了int
值的前 24 位。 所以0xffffffc5 & 0xff
變成0x000000c5
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.