[英]GCC -Wconversion warning for 16-bit addition
解决现有代码库中此类警告的正确方法是什么?
void test(uint16_t x, uint16_t y)
{
// warning: conversion to 'uint16_t' from 'int' may alter its value
uint16_t value = (x + 1) * y;
...
}
所有这三个值都是无符号的16位整数,任何算术溢出都将正确执行,而不会警告该平台的int
是16位,而且除了强制转换结果外,我看不到应该编写这段代码的其他方式整数促销。
我应该在所有这些情况下投身吗? 投放感觉就像我做错了什么。
至少在代码应该可移植的情况下,这才是正确的做法。 如果仅针对16位平台进行编译,则不应发出警告,否则,请使用明确的uint16_t
为uint16_t
来使警告静音:
uint16_t value = (uint16_t) (x + 1) * y;
没有什么可以做的更好了:所有算术运算都(至少)以int
,并且编译器会提醒您。 根据x
和y
的值,结果很可能不适合uint16_t
。 明确地编写您知道的演员表文件,或者想要截断或确保不会发生截断。
注意:以下仅适用于16位int情况
警告:关于x
到int
隐式转换,因为1
的类型为int
。 出于相同原因,以后将y
转换为int
也会触发此操作。
只需将1
标记为未签名
void test(uint16_t x, uint16_t y)
{
uint16_t value = (x + 1u) * y;
...
}
无需铸造。
这也将在16位的情况下工作 :
void test(uint16_t x, uint16_t y)
{
uint16_t value = x * y + y;
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.