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 位的,我看不出这段代码应该有其他方式被写入,除了由于整数提升而转换结果。
- 我应该在所有这些情况下投射吗?选角感觉我做错了什么。
- 禁用警告?我不想完全禁用警告,因为它在某些情况下可能会有用。
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
。明确编写演员文件,您知道这一点,并且想要截断或确保不会发生。
注:以下只适用于16位int的情况
警告:关于 x
到 int
的隐式转换,因为 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;
...
}
解决现有代码库中此类警告的正确方法是什么?
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
。明确编写演员文件,您知道这一点,并且想要截断或确保不会发生。
注:以下只适用于16位int的情况
警告:关于 x
到 int
的隐式转换,因为 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;
...
}