同字节大小的整数类型,有符号可以隐式转换为无符号,反之则不行(有警告)
因此你可以写
int8_t n = -1; uint8_t m = n; // 255 // ...同符号整数转换
较小字节的整数可以隐式转换到较大字节的同符号整数,反之不行(有截断风险)
因此你可以写:
int8_t n = -1; int16_t m = n; // 也是-1 int32_t m1 = n; // 仍旧是-1较小字节有符号整数转换到较大字节无符号整数 正确的转换路径:
比如:
因此你可以写:
int8_t n = -1; uint16_t m = n; // 65535 uint32_t m1 = n; // 4294967295常见的转换误区:
也就是说, int8_t 的-1转换到uint16_t的值应该是65535而不是255
如果实际确实是需要将小字节整数的值完整字节存放到较大字节无符号整数的低位只需要强制扭转 少字节有符号整数到多字节无符号整数的转换路径:
如何扭转,其实也很简单
int8_t a = -1;
uin16_t b = uint8_t{a}; // 或者 (uint8_t)a 或者 static_cast(a)



