[英]Converting unsigned char array to signed short in C
我想將一個無符號字符數組轉換為有符號整數! 我已經做了一些嘗試,轉換適用於這樣的單個元素:
unsigned char byte[2];
signed char *valueS[2];
byte[0] = 0b11110111;
byte[1] = 0b00001001;
//Conversion
for(int i = 0; i < 2; i++)
{
valueS[i] = (signed char*)&byte[i];
}
//Result
printf("Val 0 -> %d \n", *valueS[0]); // print -9 Correctly
printf("Val 1 -> %d \n", *valueS[1]); // print 9 Correctly
//But when i try to print a 16 bit signed
printf("Int %d \n", *(signed short*)valueS); //It doesn't work! I expected -2295
我怎樣才能從那個無符號字符數組中得到 16 位有符號整數? 先感謝您!
我怎樣才能從那個無符號字符數組中得到 16 位有符號整數?
假設您的意思是要獲得int16_t
其表示形式與兩個unsigned char
的任意數組的內容逐字節相同,唯一符合要求的方法是聲明一個int16_t
對象並將數組元素復制到其表示形式。 您可以使用memcpy()
函數進行復制,也可以手動進行。
例如,
#include <stdint.h>
// ...
unsigned char byte[2] = { 0xF7, 0x05 };
int16_t my_int;
unsigned char *ip = (unsigned char *) &my_int;
ip[0] = byte[0];
ip[1] = byte[1];
printf("Int %d \n", my_int);
您可能會看到建議使用指針別名技巧來嘗試將數組的字節直接重新解釋為整數的表示。 這將采用類似於您的代碼示例的形式,但這種方法是不符合標准的,並且在形式上它會產生未定義的行為。 您可以通過指向 [ unsigned
] char
的指針訪問任何類型對象的表示,正如本答案中的代碼所做的那樣,但通常,您可能無法通過指向與該對象不兼容的類型的指針訪問對象。
還要注意,上面的printf
有點草率。 如果int16_t
是與int
不同的類型,例如short int
,則相應的printf
指令中將包含長度修飾符——可能是%hd
。 但是由於printf
聲明方式的細節,將my_int
為int
結果將傳遞給printf
。 這樣可以避免不匹配,並且在實踐中,打印的結果將與您使用正確的指令相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.