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

Pet*_*ter 8 c casting

我的问题看起来很像

如何在两个32位整数中存储64位整数并再次转换回来

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

我的问题是这是否:

uint8_t a;
uint32_t b;
a = b;
Run Code Online (Sandbox Code Playgroud)

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

Nik*_*sov 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 */
Run Code Online (Sandbox Code Playgroud)

或这个:

union u
{
    uint32_t num32;

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

    } bytes;

} converter;

converter.num32 = 0xdeadbeef;
Run Code Online (Sandbox Code Playgroud)

第一个例子并不能依赖于平台的字节顺序,第二个.

  • 是的,这就是我在答案中所说的,不是吗? (7认同)

Kon*_*lph 9

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

a = b % ((uint32_t)UINT8_MAX + 1);
Run Code Online (Sandbox Code Playgroud)


ken*_*ytm 5

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

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

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