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

在所示的位移示例中

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

三个问题:

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

最佳答案 1.

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

2.

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

3.

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

点赞