int到char cast

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

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

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

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

由于您从较大的整数类型转换为较小的整数类型,因此无论字节顺序如何,它都是最不重要的部分。 但是,如果您正在转换指针,那么它将占用地址处的字节,这取决于字节顺序。

所以c = (char)i将最不重要的字节分配给c ,但是c = *((char *)(&i))会将i的地址的第一个字节分配给c ,这在小的情况下是相同的 – 仅限印度系统。

如果你想测试小/大端,你可以使用一个联合:

 int isBigEndian (void) { union foo { size_t i; char cp[sizeof(size_t)]; } u; ui = 1; return *u.cp != 1; } 

它的工作原理是因为在小端,它看起来像01 00 … 00,但在大端,它将是00 … 00 01(……由零组成)。 因此,如果第一个字节为0,则测试返回true。 否则返回false。 但要注意,还存在以不同方式存储数据的混合端机器(有些可以切换字节序;有些只是以不同方式存储数据)。 PDP-11将32位int存储为两个16位字,除了字的顺序颠倒(例如0x01234567为4567 0123)。

从int(4字节)转换为char(1字节)时,它将保留最后1个字节。 例如:

 int x = 0x3F1; // 0x3F1 = 0000 0011 1111 0001 char y = (char)x; // 1111 0001 --> -15 in decimal (with Two's complement) char z = (unsigned char)x; // 1111 0001 --> 241 in decimal