对减去uint16_t值几乎没有困惑
Little confused on subtracting uint16_t values
所以我试图互相减去两个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
中完成的。
然后,警告会告诉您,当您使用它初始化total
时,您正在将该有符号int
结果强制转换为无符号类型(uint16_t
(,这通常不是您想要做的,因为无符号类型无法存储有符号类型可能持有的负值。
如果减法可能产生负值,则根本不应该使用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);
如果不想重复类型名称。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 如果没有malloc,链表实现将失败
- 数组索引的值没有增加
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 对减去uint16_t值几乎没有困惑
- write() 和 read() 中几乎没有混淆
- 有没有办法组合多个几乎相同的功能?
- 从旧的 C 样式指针移动到C++智能指针,代码几乎没有变化
- 几乎所有形式的字符串比较都在C 11中没有起作用
- OpenMP:嵌套的 for 循环,执行时间几乎没有任何差异
- 编译带有活动霓虹灯标志的代码几乎没有任何改进(甚至恶化)
- 为什么我遇到此代码的分段错误?此代码几乎没有运行,因此构造函数或复制构造函数中可能存在错误
- 在C++中使用 I/O 文件几乎没有问题(战略客户没有帮助)
- 几乎平均拆分浮点数,没有损失
- 使用多个线程时性能几乎没有提高
- 类的类设计几乎没有什么不同
- 对于编译时的1.constructor和2.array定义,几乎没有什么疑问