int到char cast

时间:2011-09-21 17:49:20

标签: 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?? */

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

4 个答案:

答案 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