c - 16 位加法的 GCC -Wconversion 警告

标签 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;
    ...
}

所有三个值都是无符号的 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。明确编写您知道的类型转换文件,并希望截断或确保不会发生。

关于c - 16 位加法的 GCC -Wconversion 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51174412/

相关文章:

c - 如何在 C++ 中分配非常大的字段

C11 相当于 POSIX flockfile()?

c - GCC 是如何实现变长数组的?

c - GCC的GNU C标准和ANSI C之间的区别?

c - 在 c 中使用三元运算符的错误

c++-cli - Visual C++ 2010 -> 窗口窗体。如何将字符串转换为int?

postgresql - 如何在CREATE TYPE中使用原始Postgres input/output_function?

c - BUILD_BUG_ON_ZERO 在简单的用户空间应用程序中不起作用

c - 在 Visual Studio 中用 C 语言初始化字符串

c++ - 将 boost::asio::ip::address_v4 隐藏为字符串