C中的隐式类型转换(将32位无符号转换为8位u int)

时间:2010-06-28 14:46:33

标签: c casting

我的问题看起来很像

How to store a 64 bit integer in two 32 bit integers and convert back again

(我有一个无符号32位,我需要在C中放入4个无符号8位变量)

我的问题是:

uint8_t a;
uint32_t b;
a = b;

保证a填充了最右边的8位,而不是最左边的8位?

4 个答案:

答案 0 :(得分:16)

是。这样做:

uint32_t num32 = 0xdeadbeef;

uint8_t a = num32;       /* 0xef */
uint8_t b = num32 >> 8;  /* 0xbe */
uint8_t c = num32 >> 16; /* 0xad */
uint8_t d = num32 >> 24; /* 0xde */

或者这个:

union u
{
    uint32_t num32;

    struct
    {
        uint8_t a;
        uint8_t b;
        uint8_t c;
        uint8_t d;

    } bytes;

} converter;

converter.num32 = 0xdeadbeef;

第一个示例依赖于平台endianess,第二个

答案 1 :(得分:9)

我不知道你最左边和最左边是什么意思(字节序?)但C保证a将包含b的8个低阶(最低有效)位。也就是说,赋值在逻辑上等同于:

a = b % ((uint32_t)UINT8_MAX + 1);

答案 2 :(得分:5)

从C标准,保证a == b % (max_of_uint8_t + 1),即最低有效8位。在§6.3.1.3(有符号和无符号整数)中:

  
      
  1. 当具有整数类型的值转换为除_Bool以外的其他整数类型时,如果该值可以由新类型表示,则它将保持不变。
  2.   
  3. 否则,如果新类型是无符号的,通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内。
  4.   

如果您需要安全,请使用a = b & 0xff

答案 3 :(得分:0)

您可以查看union declaration。如果您可以保证处理器/数据源不会改变,我认为您可以假设“endianness