GCC -Wconversion警告16位加法

时间:2018-07-04 13:04:02

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

2 个答案:

答案 0 :(得分:6)

  

在所有这些情况下我都应该投吗?投射感觉就像我做错了。

至少在代码可移植的情况下,这是正确的做法。如果仅针对16位平台进行编译,则不应发出警告,否则,请使用显式强制转换为<script> $(document).ready( function() { $('#education').on( 'change', function() { if ($(this).val() == "6") { $('#checkBox').show(); //check box exists } else { $('#checkBox').hide(); //check box exists } }); }); $('#checkBox').on( 'change', function() { if ($('#checkBox').is(":checked")) { $("#txtData").show(); } else { $("#txtData").hide(); } }); </script>来使警告静音:

uint16_t

您无能为力:所有算术运算都(至少)以uint16_t value = (uint16_t) (x + 1) * y; 的形式执行,编译器会提醒您。根据{{​​1}}和int的值,结果很可能不适合x。明确地编写您知道的转换文档,并希望截断或确保不会发生。

答案 1 :(得分:2)

注意:以下仅适用于16位int情况

警告:关于xint的隐式转换,因为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;
    ...
}