3

我想转换一个无符号整数并将其分解为 2 个字符。例如:如果整数为 1,则其二进制表示为 0000 0001。我希望一个 char 变量中的 0000 部分和另一个二进制变量中的 0001 部分。我如何在 C 中实现这一点?

4

6 回答 6

6

如果你坚持你有一个sizeof(int)==2then:

  unsigned int x = (unsigned int)2; //or any other value it happens to be
  unsigned char high = (unsigned char)(x>>8);
  unsigned char low  = x & 0xff;

如果您总共有 8 位(一个字节)并且您将其分成两个 4 位值:

  unsigned char x=2;// or whatever
  unsigned char high = (x>>4);
  unsigned char low = x & 0xf;
于 2013-02-19T05:24:42.353 回答
3

移动并屏蔽您想要的数字部分。无符号整数可能是四个字节,如果你想要所有四个字节,你只需移动 16 和 24 以获得高阶字节。

unsigned char low  =  myuint       & 0xff;
unsigned char high = (myuint >> 8) & 0xff;
于 2013-02-19T05:23:35.777 回答
2

这是假设使用 sizeof 进行 16 位整数检查!在我的平台上,整数是 32 位的,所以我将在这个代码示例中使用一个简短的。我的在拆开指针方面获得了最恶心的奖项 - 但它也是我最清楚地理解的。

unsigned short number = 1;

unsigned char a;
a = *((unsigned char*)(&number)); // Grab char from first byte of the pointer to the int

unsigned char b;
b = *((unsigned char*)(&number) + 1); // Offset one byte from the pointer and grab second char
于 2013-02-19T05:29:22.403 回答
2

一种有效的方法如下:

typedef union 
{
  unsigned char c[sizeof(int)];
  int           i;
} intchar__t;

intchar__t x;
x.i = 2;

现在 xc[] (一个数组)将整数作为一系列字符引用,尽管您将遇到字节端序问题。可以使用适合您正在编程的平台的#define 值来解决这些问题。这类似于 Justin Meiners 提供的答案,但更简洁一些。

于 2013-02-19T06:27:40.833 回答
0
unsigned short s = 0xFFEE;
unsigned char b1 = (s >> 8)&0xFF;
unsigned char b2 = (((s << 8)>> 8) & 0xFF);

我能想到的最简单的。

于 2013-02-19T05:23:25.910 回答
0
int i = 1  // 2 Byte integer value 0x0001
unsigned char byteLow = (i & 0x00FF); 
unsinged char byteHigh = ((i & 0xFF00) >> 8); 

byteLow 中的值为0x01byteHigh 中的值为 0x00

于 2013-02-19T05:27:20.297 回答