在char数组和掩码中使用int而不是char

时间:2012-08-26 11:01:47

标签: c bit-manipulation

在所示的位移示例中 here

 unsigned long int longInt = 1234567890;
 unsigned char byteArray[4];

 // convert from an unsigned long int to a 4-byte array
 byteArray[0] = (int)((longInt >> 24) & 0xFF) ;
 byteArray[1] = (int)((longInt >> 16) & 0xFF) ;
 byteArray[2] = (int)((longInt >> 8) & 0XFF);
 byteArray[3] = (int)((longInt & 0XFF));

三个问题:

  1. 为什么是(int)而不是(unsigned char)?我用unsigned char尝试了它,似乎编译得很好。
  2. 需要0XFF吗?是不是新位移入了0因为维基百科说C使用逻辑移位和0中的逻辑移位移位? (编辑:至少它似乎没有必要用>> 24?)
  3. 我不能只使用memcpy()将longInt复制到unsigned char缓冲区吗?是不是因为Endianness的问题?还有其他原因吗?

1 个答案:

答案 0 :(得分:2)

<强> 1

((longInt >> 24) & 0xFF)表达式的类型为unsigned long int。通过转换为int,表达式首先转换为int,然后转换为unsigned char。如果您不转换为int,则表达式不会首先转换为int。两种情况没有区别,演员阵容是多余的。

<强> 2

0xff不是必需的。转换为unsigned char实际上执行相同的操作。

第3

您可以使用memcpy,但它不可移植,因为它取决于系统的字节顺序。如果系统是大端或小端,它将给出不同的结果,而按位移位解将给出相同的结果。