解决现有代码库中此类警告的正确方法是什么?
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 位的,我看不到这段代码的另一种方式应该写,除了由于整数提升而转换结果。
- 我应该在所有这些情况下转换吗?选角感觉我做错了什么。
- 禁用警告?我不想完全禁用警告,因为它在某些情况下可能会有用。
最佳答案
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
的形式执行,编译器会提醒您这一点。根据 x
和 y
的值,结果很可能不适合 uint16_t
。明确编写您知道的类型转换文件,并希望截断或确保不会发生。
关于c - 16 位加法的 GCC -Wconversion 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51174412/