簡體   English   中英

警告:從“ int”轉換為“ unsigned char”可能會改變其值

[英]warning: conversion to 'unsigned char' from 'int' may alter its value

代碼是:

*(buf+2) |= (unsigned char)(mFlag & 0x7f);

bufunsigned char *mFlagunsigned char

我想這是因為operator|=的返回值使我得到警告

警告:從“ int”轉換為“ unsigned char”可能會改變其值

如何刪除警告? 是由於operator|=嗎?

在C語言中,所有算術運算符(包括& )的類型至少與int一樣寬。 因此,根據常量的類型,表達式的結果將始終為intunsigned

由於常量0x7f顯然在任何字符類型的范圍內,因此編譯器給出的警告實際上並沒有幫助,我什至認為它是一個錯誤。

您唯一可以做的就是

*(buf+2) = (unsigned)*(buf+2) | 0x7FU; 

那就是將值顯式轉換為更廣泛的類型。 如果這樣仍然給您警告,請謹慎使用

*(buf+2) = (unsigned char)((unsigned)*(buf+2) | 0x7FU);

但是您應該確定要升級編譯器或更改使用的警告選項。

要刪除警告,您顯然需要一個臨時變量來保存0x7f值。

unsigned char x = 0x7f;
*(buf+2) |= mFlag & x;

問題似乎是編譯器正在處理通過強制轉換將文字轉換為unsigned char任何嘗試,從而導致警告(進一步的討論表明,此操作特定於|=運算符,簡單賦值似乎沒有問題) 。 但是,允許在沒有警告的情況下初始化變量。

另一個解決方法是定義一個內聯函數以實現與強制轉換相同的目的。 我使此函數看起來類似於C ++ static_cast<>

template <typename T>
inline T static_conversion (T x) { return x; }
//...
*(buf+2) |= mFlag & static_conversion<unsigned char>(0x7f);

由於C沒有模板,因此AC版本(也適用於C ++)將使用其他內聯函數:

inline unsigned char to_unsigned_char (unsigned char x) { return x; }
/* ... */
*(buf+2) |= mFlag & to_unsigned_char(0x7f);

通過將常量聲明為unsigned可以消除警告

*(buf+2) |= (mFlag & 0x7fu);

如@chris所說,它可能正在轉換掩蔽的結果(當-Wconversion標志打開時,您會收到警告)

我會用*(buf+2) = (unsigned char)((mFlag & 0x7f) | *(buf+2)); 但是,如果您堅持使用|= ,則可以利用復合文字(僅適用於C99):

*(buf+2) |= (unsigned char){mFlag & 0x7f};

暫無
暫無

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

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