如果我的理解是正确的,我正在寻找确认,如果有更优雅的方法可能需要提供信息 .

我找到了几个答案,但我认为在签名方面他们错了 .

例如,当您通过串行端口接收数据时,这是常见的情况 . 你得到了一系列的char值 . 在这种情况下,我有4个值的数组 . 它们代表4个字节的数字 .

char a[] {-103,-103,-103,-103};

I would like to convert 32-bit unsinged little endian to unsigned 32-bit value of the platform:

uint32_t p = static_cast<uint32_t>(
    static_cast<uint8_t>(a[0]) | static_cast<uint8_t>(a[1])<<8 |
    static_cast<uint8_t>(a[2])<<16 | static_cast<uint8_t>(a[3])<<24 );

uint32_t q = static_cast<uint32_t>(
    static_cast<uint8_t>(a[0]) + 256U*static_cast<uint8_t>(a[1]) + 
    65536U*static_cast<uint8_t>(a[2]) + 16777216U*static_cast<uint8_t>(a[3]) );

断言是否正确?

  • 如果我没有显式地将char值转换为uint8_t,那么如果char值为vas,则自动提升为int将创建负值 .

  • 甚至uint8_t将在位移之前被提升为int (and not to unsigned int) .

  • 较大的值将被提升为long long int .

  • 今天不支持高于64位的值 .

  • 第二版更具便携性 . (它在AMD64 gcc(和clang)上产生与第一个完全相同的二进制代码)

This is 32-bit signed litttle endian conversion to platform's signed 32 bit value:

int q = static_cast<uint8_t>(a[0]) + 256U*static_cast<uint8_t>(a[1]) + 
    65536U*static_cast<uint8_t>(a[2]) + 16777216U*a[3];

请注意,最后一个值未转换为unsigned char以保留符号 .