[英]Bitwise operation on unsigned char
我有一個示例函數如下:
int get_hash (unsigned char* str)
{
int hash = (str[3]^str[4]^str[5]) % MAX;
int hashVal = arr[hash];
return hashVal;
}
在這里,數組arr的大小為MAX。 ( int arr[MAX]
)。
我的靜態代碼檢查器抱怨這里可能存在超出范圍的數組訪問,因為哈希值可能在-255到-1范圍內。
這個對嗎? 可以對無符號char進行按位運算產生負數嗎? 哈希應該聲明為unsigned int嗎?
這個對嗎?
否,靜態代碼檢查器錯誤(1) 。
可以對無符號char進行按位運算產生負數嗎?
某些按位運算可以(例如按位補碼)可以,但不能使用異或。
對於^
,這里的unsigned char
參數必須經過通常的算術轉換(6.3.1.8),它們首先根據整數提升進行提升; 關於這些,第6.3.1.1條第2款說
如果
int
可以表示原始類型的所有值(對於位字段,受寬度限制),則該值將轉換為int
; 否則,將其轉換為unsigned int
。 這些稱為整數促銷。
因此,有兩種可能性:
一個int
可以表示unsigned char
所有可能值。 然后,從整數提升中獲得的所有值都是非負的,這些值的按位異或也不是非負的,余數也取模MAX
。 然后, hash
值的范圍為0(含)到MAX
( -MAX
)[ -MAX
MAX < 0
如果MAX < 0
]。
一個int
不能代表unsigned char
所有可能值。 然后,將值提升為unsigned int
類型,並對該類型執行按位運算。 結果當然是非負的,而余數模MAX
也將是非負的。 但是,在這種情況下,對int hash
的賦值可能會將超出范圍的值轉換為負值[超出范圍的整數到帶符號整數類型的轉換是實現定義的]。 (1)但是在那種情況下,可能的負值范圍大於-255
到-1
,因此即使在這種情況下(極不可能),靜態代碼檢查器還是有部分錯誤。
應該將hash聲明為
unsigned int
嗎?
這取決於MAX
的值。 如果極有可能余數MAX
超出int
的范圍,那將是更安全的。 否則, int
同樣安全。
正如gx_正確指出的那樣,該算法是在int
完成的。 再次將您的hash
變量聲明為unsigned char
,以確保每個人都知道您希望在所有情況下這都是肯定的。
如果MAX
實際上是UCHAR_MAX
,則應該使用它來提高可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.