簡體   English   中英

對無符號字符進行按位運算

[英]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 這些稱為整數促銷。

因此,有兩種可能性:

  1. 一個int可以表示unsigned char所有可能值。 然后,從整數提升中獲得的所有值都是非負的,這些值的按位異或也不是非負的,余數也取模MAX 然后, hash值的范圍為0(含)到MAX-MAX )[ -MAX MAX < 0如果MAX < 0 ]。

  2. 一個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.

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