GCC - 用于16位加法的转换警告

Lou*_*Lou 0 c gcc type-conversion gcc-warning

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

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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

所有这三个值都是无符号的16位整数,并且任何算术溢出都可以正确执行,而不会警告它这个平台int是16位的,我不会看到这段代码应该写的另一种方式,除了因为转换结果整数提升.

  1. 我应该抛弃所有这些案件吗?铸造感觉就像我做错了什么.
  2. 禁用警告?我宁愿不完全禁用警告,因为它在某些情况下可能有用.

小智 6

我应该抛弃所有这些案件吗?铸造感觉就像我做错了什么.

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

uint16_t value = (uint16_t) (x + 1) * y;
Run Code Online (Sandbox Code Playgroud)

你无能为力:所有的算术运算都是(至少)执行的int,编译器会提醒你.根据值x和y,它很可能的结果不符合在uint16_t.明确地写出你已经知道的演员文件,要么截断,要么保证不会发生.