对减去uint16_t值几乎没有困惑

Little confused on subtracting uint16_t values

本文关键字:几乎没有 uint16      更新时间:2023-10-16

所以我试图互相减去两个uint_16值,每次我这样做都会得到一个错误。

conversion from 'int' to 'uint16_t', signed/unsigned mismatch   
uint16_t a = 432;
uint16_t d= 60000;
uint16_t total = d -a;

我知道你需要投射它,但怎么会这样,而且这样做时不会丢失数据。

uint16_t

的整数秩很可能低于int。它可能是unsigned short的别名。

如果是这种情况,那么积分提升将应用于da,然后再减去它们。

积分提升将尝试将unsigned short转换为int,如果int可以保存所有可能的unsigned short值。只有当情况并非如此时,才会进行整体晋升unsigned int

因此,减法很可能是在类型int中完成的,而不是在uint16_t中完成的。

然后,警告会告诉您,当您使用它初始化total时,您正在将该有符号int结果强制转换为无符号类型(uint16_t(,这通常不是您想要做的,因为无符号类型无法存储有符号类型可能持有的负值。


如果减法可能产生负值,则根本不应该使用uint16_t。相反,您应该手动将操作数转换为合适的有符号整数类型,并将结果存储为合适的有符号整数类型(即intint32_t(:

int32_t total = static_cast<int32_t>(d)-static_cast<int32_t>(a);

auto total = static_cast<int32_t>(d)-static_cast<int32_t>(a);

以减少重复。

如果您保证减法不会产生任何负值,则可以添加一个static_cast来告诉编译器您确实知道自己在做什么:

uint16_t total = static_cast<uint16_t>(d-a);

auto total = static_cast<uint16_t>(d-a);

如果不想重复类型名称。