int i = 259; /* 03010000 in Little Endian ; 00000103 in Big Endian */
char c = (char)i; /* returns 03 in both Little and Big Endian?? */
在我的电脑上,c 字符被分配了 03,并且我使用的是小端序(Little Endian),但我不知道字符转换是否读取最不重要的字节或读取由 i 变量指向的字节。在这里,字节序并不会对任何事情产生影响。它并不尝试存储其中一个字节(MSB、LSB等)。
char
是无符号的,它将会发生包装。假设8位char,则259%256 = 3。char
是有符号的,那么结果是实现定义的。感谢pmg:C99标准6.3.1.3/3由于您正在从较大的整数类型转换为较小的整数类型,因此它将获取最不重要的部分,而不考虑字节序。但是,如果您转换指针,则会获取地址处的字节,这取决于字节序。
因此,c = (char)i
将最不重要的字节赋给 c
,但是 c = *((char *)(&i))
会将地址为 i
的第一个字节赋给 c
,在小端系统上是相同的。
如果您想测试小/大端,请使用联合(union):
int isBigEndian (void)
{
union foo {
size_t i;
char cp[sizeof(size_t)];
} u;
u.i = 1;
return *u.cp != 1;
}
当从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
char
是有符号的,行为是实现定义的(参见C99标准中的6.3.1.3/3)。此外,char
是有符号还是无符号也是实现定义的。 - pmg