如果我有,例如:
int32_t x = 572662306; /* 00100010001000100010001000100010 */
我想在int8_t
中存储两个最重要的字节:
00100010 (base 2) = 34 (base 10)
或int16_t
中的四个最重要的字节:
0010001000100010 (base 2) = 8738 (base 10)
我该怎么做?
答案 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
具有签名类型和负值,则结果值是实现定义的。