[英]Splitting an Int to 3 bytes and back in C
我有以下代碼將int拆分為3個字節,然后返回:
#include <stdio.h>
#include <stdint.h>
int main()
{
int a = 626;
uint8_t msb = (a >> 16) & 0xff;
uint8_t msb1 = (a >> 8) & 0xff;
uint8_t lsb = a & 0xff;
printf("MSB: %u, MSB1: %u, LSB: %u\n", msb, msb1, lsb);
uint8_t h1 = msb << 16;
uint8_t h2 = msb1 << 8;
uint8_t h3 = lsb & 0xff;
int b = h1 | h2 | h3;
printf("Final: %d\n", b);
return 0;
}
當我運行此代碼時,輸出如下:MSB:0,MSB1:2,LSB:114最終:114
我應該獲得626的最終成績,但獲得114的成績。如果有人可以提供幫助,那就太好了。 謝謝
一個可能的解決方案是
#include <stdio.h>
#include <stdint.h>
int main(void)
{
int a = 626;
uint8_t msb = (a >> 16) & 0xff;
uint8_t msb1 = (a >> 8) & 0xff;
uint8_t lsb = a & 0xff;
printf("MSB: %u, MSB1: %u, LSB: %u\n", msb, msb1, lsb);
uint32_t b = msb;
b = (b<<8) | msb1;
b = (b<<8) | lsb;
printf("Final: %d\n", b);
return 0;
}
如你看到的:
6.5.7 / 4如果E1具有帶符號的類型和非負值,並且E1×2 E2在結果類型中可表示,則為結果值; 否則,行為是不確定的。
8 bits
)右移8
或16
,這意味着您丟失了所有位。 因此,您可以看到,首先,可以將第一個值分配給一個較大的變量(無符號int),然后將其移位。 首先,請確保您沒有混合有符號和無符號整數。 然后,我假設輸入整數是無符號32。
我的解決方案如下:
#include <stdio.h>
#include <stdint.h>
int main()
{
uint32_t a = 626;
uint8_t bytes[4];
bytes[0] = a & 0xff; //contains Lsb
bytes[1] = (a >> 8) & 0xff;
bytes[2] = (a >> 16) & 0xff;
bytes[3] = (a >> 24) & 0xff; //contains msb
printf("Bytes: %u, %u, %u, %u\n", bytes[0], bytes[1], bytes[2], bytes[3]);
uint32_t b = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | bytes[0];
printf("Final: %u\n", b);
return 0;
}
正如米沙所說。 您需要用大於8位的值來處理結果。 否則,當移位超過8位時,您將失去這些位。
嘗試使用大於uint8_t
例如u int32_t
在這些陳述中
uint8_t h1 = msb << 16;
uint8_t h2 = msb1 << 8;
uint8_t h3 = lsb & 0xff;
由於使用uint8_t
類型,結果被截斷為一個字節。
改用
int h1 = msb << 16;
int h2 = msb1 << 8;
int h3 = lsb & 0xff;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.