【问题标题】:GCC -Wconversion warning for 16-bit addition16 位加法的 GCC -Wconversion 警告
【发布时间】:2018-07-04 13:04:01
【问题描述】:

在现有代码库中解决此类警告的正确方法是什么?

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. 禁用警告?我不希望完全禁用该警告,因为它在某些情况下可能有用。

【问题讨论】:

  • 是的,但int 可能是 32 位或更多。

标签: c gcc type-conversion gcc-warning


【解决方案1】:

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

这是正确的做法,至少如果代码应该是可移植的。如果它只为 16 位平台编译过,则不应出现警告,否则,通过显式强制转换为 uint16_t 来消除警告:

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

没有比这更好的方法了:所有算术运算都以(至少)int 执行,编译器会提醒您这一点。根据xy 的值,很可能结果不适合uint16_t。明确编写您知道的演员表文件,并且希望截断或确保不会发生。

【讨论】:

    【解决方案2】:

    注意:以下仅适用于 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;
        ...
    }
    

    【讨论】:

    • 这只对 16 位 int 有意义,而且这个问题读起来不像是假设/保证的。虽然不是我的 DV ...
    • @FelixPalmen OP 说平台的 int 是 16 位
    • 将在没有警告的情况下正确执行,因为这个平台的 int 是 16 位”听起来像是虚拟语气。另外,好的编译器通常会对有符号/无符号转换有明确的警告。
    • @FelixPalmen,不是我的母语 :),不得不谷歌虚拟语气
    • 您永远无法确定,这就是为什么我认为您的答案应该明确说明它关于 16 位平台的特殊情况 :) (在所有其他情况下,铸造 是避免典型警告所必需的)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多