4

在此处显示的位移示例中 :

 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,因为 Wikipedia 说 C 使用逻辑位移和逻辑位移位移 0?(编辑:至少在具有 >> 24 的情况下似乎没有必要?)
  3. 我不能只做一个 memcpy() 将 longInt 复制到 unsigned char 缓冲区吗?不是因为字节序的问题吗?还有其他原因吗?
4

1 回答 1

2

1.

((longInt >> 24) & 0xFF)表达式是类型unsigned long int。使用强制int转换,表达式首先转换为intthen to unsigned char。如果不强制int转换为表达式,则不会先转换为int. 这两种情况没有区别,演员阵容是多余的。

2.

0xff没有必要。转换为unsigned char实际执行相同的操作。

3.

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

于 2012-08-26T11:06:14.603 回答