[英]Convert int (32 bits) to char (8 bits)
我有這些定義:
int data = uartBaseAddress[UART_DATA_REGISTER / 4]; // data coming from UART RX port
char message[20]; // array of 20 chars
現在當我嘗試這樣做時:
message[0] = (char) data;
printf("%x", message[0]);
它打印(例如): "ffffff9c"
。 當然我只想要最后8位(“9c”),我不明白如何正確地進行從int
到char
的轉換。
編輯:我的意思是:我必須像這樣填充數組:
data = 0xFFFFFF9c;
message[0] = data & 0xFF; -- it has to contain only 9c
data = 0xFFFFFFde;
message[1] = data & 0xFF; -- it has to contain only de
etc...
轉換是正確的。 這是printf
的問題所在。
顯然,在您的系統上簽署了簡單char
(可以是簽名或未簽名)。
我打算猜測打印的值是ffffff9c
(8位),而不是ffffffff9c
(10位); 請驗證。
data
的價值可能是-100
。 將該值從int
轉換為char
將產生-100
,因為該值在char
類型的范圍內(可能是-128
.. +127
)。
但是%x
格式說明符需要類型為unsigned int
的參數,而不是int
。 當傳遞給printf
時, message[0]
值被提升為int
,但是由於格式字符串, printf
假定參數的類型為unsigned int
。
嚴格來說,行為是未定義的,但很可能printf
只是將傳遞給它的int
值視為unsigned int
。 (int)-100
和(unsigned int)0xffffff9c
具有相同的表示。
沒有printf
格式說明符以十六進制格式打印有符號值。 如果將格式從%x
更改為%d
,則至少會看到正確的值。
但你應該退一步決定你想要完成的事情。 如果你想提取低8位data
,你可以通過屏蔽它來實現,正如unwind的答案所暗示的那樣。 或者您可以將其轉換為unsigned char
而不是plain char
以保證您將獲得無符號值。
當傳遞給printf
, unsigned char
值仍然被提升為int
,所以要完全正確,你應該顯式地將它轉換為unsigned int
:
int data = ...;
unsigned char message[20]; // change to unsigned char
message[0] = data; // no cast needed, the value is implicitly converted
printf("%x", (unsigned int)message[0]);
嚴格地說, (unsigned int)
不是必需的。 message[0]
是一個unsigned char
,因此它將被轉換為非負的int
值,並且有一個特殊情況規則,即int
和帶有相同值的unsigned int
參數可以作為函數參數互換。 盡管如此,我自己的偏好是使用強制轉換,因為它更清晰,並且因為添加強制轉換更容易(特別是對於閱讀代碼的任何人)而不是遵循說沒有必要的推理線。
不需要message
,只需屏蔽掉你不想要的信息:
printf("%x\n", data & 0xff);
要將32位整數轉換為8位數的4元素數組,請執行以下操作:
const uint32_t data = ...
uint8_t message[20];
for(int i = 0; i < 4; ++i)
{
message[i] = data & 0xff;
data >>= 8;
}
以上使用little-endian字節順序。 如果data
是0x12345678
,則message
將開始0x78, 0x56, 0x34, 0x12
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.