[英]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位,而且除了強制轉換結果外,我看不到應該編寫這段代碼的其他方式整數促銷。
我應該在所有這些情況下投身嗎? 投放感覺就像我做錯了什么。
至少在代碼應該可移植的情況下,這才是正確的做法。 如果僅針對16位平台進行編譯,則不應發出警告,否則,請使用明確的uint16_t
為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;
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.