簡體   English   中英

將int(32位)轉換為char(8位)

[英]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”),我不明白如何正確地進行從intchar的轉換。

編輯:我的意思是:我必須像這樣填充數組:

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以保證您將獲得無符號值。

當傳遞給printfunsigned 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字節順序。 如果data0x12345678 ,則message將開始0x78, 0x56, 0x34, 0x12

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM