16 位加法的 GCC -Wconversion 警告

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

Should I cast in all such cases? Casting feels like I am doing something wrong.

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

来消除警告
uint16_t value = (uint16_t) (x + 1) * y;

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

注:以下只适用于16位int的情况

警告:关于 xint 的隐式转换,因为 1int 类型。 出于同样的原因,稍后将 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;
    ...
}