繁体   English   中英

GCC -Wconversion警告16位加法

[英]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位,而且除了强制转换结果外,我看不到应该编写这段代码的其他方式整数促销。

  1. 我应该在所有这些情况下投身吗? 投放感觉就像我做错了什么。
  2. 禁用警告? 我不希望完全禁用该警告,因为在某些情况下它可能很有用。

我应该在所有这些情况下投身吗? 投放感觉就像我做错了什么。

至少在代码应该可移植的情况下,这才是正确的做法。 如果仅针对16位平台进行编译,则不应发出警告,否则,请使用明确的uint16_tuint16_t来使警告静音:

uint16_t value = (uint16_t) (x + 1) * y;

没有什么可以做的更好了:所有算术运算都(至少)以int ,并且编译器会提醒您。 根据xy的值,结果很可能不适合uint16_t 明确地编写您知道的演员表文件,或者想要截断或确保不会发生截断。

注意:以下仅适用于16位int情况

警告:关于xint隐式转换,因为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM