所以我试图将两个 uint_16 值相减,每次我这样做时都会出错。
conversion from 'int' to 'uint16_t', signed/unsigned mismatch
uint16_t a = 432;
uint16_t d= 60000;
uint16_t total = d -a;
我知道您需要转换它,但是如何转换,并且这样做不会丢失数据。
所以我试图将两个 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
.
如果是这种情况,那么积分提升将在它们被减去之前应用。d
a
积分提升将尝试转换unsigned short
为int
是否int
可以容纳 的所有可能值unsigned short
。只有在不是这样的情况下才会unsigned int
执行积分促销。
因此减法最有可能在类型中完成int
,而不是uint16_t
。
然后警告告诉您,当您使用它进行初始化时,您正在将该签名int
结果转换为无符号类型 ( ) ,这通常不是您想要做的,因为无符号类型不能存储有符号类型可能持有的负值。uint16_t
total
如果减法可能产生负值,那么您根本不应该使用uint16_t
。相反,您应该手动将操作数转换为合适的有符号整数类型并将结果存储为合适的有符号整数类型(即int
或int32_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);
如果您不想重复类型名称。