たとえば、次のようにします。
int32_t x = 572662306; /* 00100010001000100010001000100010 */
最上位2バイトを次のように格納したいint8_t
:
00100010 (base 2) = 34 (base 10)
または、次の 4 つの最上位バイトint16_t
:
0010001000100010 (base 2) = 8738 (base 10)
これどうやってするの?
これは、バイトを抽出するのに非常に興味のない数値です。すべてのバイトは0x22
. とにかく、これを行う1つの方法を次に示します。
#include <stdio.h>
#include <stdint.h>
int main()
{
int32_t num = 572662306;
int8_t num2;
int8_t num3;
int16_t num4;
int16_t num5;
printf("num in hex: 0x%x\n", num);
num2 = (num >> 24);
num3 = (num >> 16);
num4 = (num >> 16);
num5 = num;
printf("num2 in hex: 0x%x\n", num2);
printf("num3 in hex: 0x%x\n", num3);
printf("num4 in hex: 0x%x\n", num4);
printf("num5 in hex: 0x%x\n", num5);
}
出力:
16 進数: 0x22222222 16 進数の num2: 0x22 16 進数の num3: 0x22 16 進数の num4: 0x2222 16 進数の num5: 0x2222
PS
負の数のビットシフトには注意が必要です。符号なしの数値に対してビット シフトを実行することをお勧めします。が負の場合num
、右へのビット シフトの結果は実装定義です。C99 標準 (6.5.7/5) から:
の結果
E1 >> E2
はE1
右シフトされたE2
ビット位置です。符号なしの型の場合E1
、または符号付きの型E1
で負でない値の場合、結果の値はE1 /
2 E2の商の整数部分です。符号付きの型と負の値を持つ場合E1
、結果の値は実装定義です。