簡體   English   中英

GCC -Wconversion警告16位加法

[英]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位,而且除了強制轉換結果外,我看不到應該編寫這段代碼的其他方式整數促銷。

  1. 我應該在所有這些情況下投身嗎? 投放感覺就像我做錯了什么。
  2. 禁用警告? 我不希望完全禁用該警告,因為在某些情況下它可能很有用。

我應該在所有這些情況下投身嗎? 投放感覺就像我做錯了什么。

至少在代碼應該可移植的情況下,這才是正確的做法。 如果僅針對16位平台進行編譯,則不應發出警告,否則,請使用明確的uint16_tuint16_t來使警告靜音:

uint16_t value = (uint16_t) (x + 1) * y;

沒有什么可以做的更好了:所有算術運算都(至少)以int ,並且編譯器會提醒您。 根據xy的值,結果很可能不適合uint16_t 明確地編寫您知道的演員表文件,或者想要截斷或確保不會發生截斷。

注意:以下僅適用於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;
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM