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转换是读取最低有效字节还是读取指向的字节我变量。
答案 0 :(得分:13)
Endianness实际上并没有改变任何东西。它不会尝试存储其中一个字节(MSB,LSB等)。
char
未签名,它将会回滚。假设8位字符259%256 = 3 char
已签名,则结果是实现定义的。谢谢pmg:C99标准中的6.3.1.3/3 答案 1 :(得分:7)
由于您从较大的整数类型转换为较小的整数类型,因此无论字节顺序如何,它都是最不重要的部分。但是,如果您正在转换指针,那么它将占用地址处的字节,将依赖于字节序。
因此c = (char)i
将最不重要的字节分配给c
,但c = *((char *)(&i))
会将地址i
的第一个字节分配给c
,在little-endian系统上只会是同样的事情。
答案 2 :(得分:1)
如果你想测试小/大端,你可以使用union:
int isBigEndian (void)
{
union foo {
size_t i;
char cp[sizeof(size_t)];
} u;
u.i = 1;
return *u.cp != 1;
}
它有效,因为在小端,它看起来像01 00 ... 00,但在大端,它将是00 ... 00 01(......由零组成)。因此,如果第一个字节为0,则测试返回true。否则返回false。但要注意,还存在以不同方式存储数据的混合端机器(有些可以切换字节序;有些只是以不同方式存储数据)。 PDP-11将32位int存储为两个16位字,但字的顺序相反(例如0x01234567为4567 0123)。
答案 3 :(得分:-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