如何从int32_t中提取字节块并使用c将其存储在int16_t或int8_t中?

时间:2015-03-23 03:09:09

标签: c binary byte converter stdint

如果我有,例如:

int32_t x = 572662306;  /* 00100010001000100010001000100010 */

我想在int8_t中存储两个最重要的字节:

00100010 (base 2) = 34 (base 10) 

int16_t中的四个最重要的字节:

0010001000100010 (base 2) = 8738 (base 10) 

我该怎么做?

1 个答案:

答案 0 :(得分:0)

这是一个非常无趣的数字,可以从中提取字节数。所有字节都是0x22。无论如何,这是一种方法:

#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);
}

输出:

num in hex: 0x22222222
num2 in hex: 0x22
num3 in hex: 0x22
num4 in hex: 0x2222
num5 in hex: 0x2222

<强> PS

你必须小心移位负数。最好对无符号数进行位移。如果num为负数,则向右移位的结果是实现定义的。从C99标准(6.5.7 / 5):

  

E1 >> E2的结果是E1右移E2位位置。如果E1具有无符号类型或E1具有带符号类型和非负值,则结果的值是E1 / 2 E2 <的商的整数部分/ SUP>。 如果E1具有签名类型和负值,则结果值是实现定义的。