int到char cast

Nei*_*art 10 c casting

int i = 259;       /* 03010000 in Little Endian ; 00000103 in Big Endian */
char c = (char)i;  /* returns 03 in both Little and Big Endian?? */
Run Code Online (Sandbox Code Playgroud)

在我的计算机中它将03分配给char c并且我有Little Endian,但我不知道char转换是读取最低有效字节还是读取i变量指向的字节.

cni*_*tar 14

Endianness实际上并没有改变任何东西.它不会尝试存储其中一个字节(MSB,LSB等).

  • 如果char是无符号的,它将环绕.假设8位字符259%256 = 3
  • 如果char已签名,则结果是实现定义的.谢谢pmg:C99标准中的6.3.1.3/3

  • +1:如果`char`被签名,则行为是实现定义的(参见[C99标准]中的6.3.1.3/3)(http://www.open-std.org/JTC1/sc22/wg14/www/docs /n1256.pdf)).此外,`char`是签名还是无符号是实现定义的. (3认同)
  • 由于它是实现定义的,一个实现当然可以自由地使用最重要的字节甚至饱和...... :-)但是在现实世界中它们都做与无符号相同的事情,即减少modulo的数量目标类型中可表示的值. (2认同)

Dmi*_*tri 7

由于您从较大的整数类型转换为较小的整数类型,因此无论字节顺序如何,它都是最不重要的部分.如果你转换指针代替,不过,这将需要在地址字节,这取决于端标记.

因此,c = (char)i分配给最不显著字节c,但c = *((char *)(&i))将在地址分配的第一个字节ic,这将是只小端系统同样的事情.