簡體   English   中英

將Int拆分為3個字節,然后用C拆分

[英]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;
}

如你看到的:

  1. 我更改了b的類型:左移帶符號的值可以是UB。

6.5.7 / 4如果E1具有帶符號的類型和非負值,並且E1×2 E2在結果類型中可表示,則為結果值; 否則,行為是不確定的。

  1. 您所做的就是將char( 8 bits )右移816 ,這意味着您丟失了所有位。 因此,您可以看到,首先,可以將第一個值分配給一個較大的變量(無符號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.

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