2012-10-06 91 views
1

我目前正在實現RC4解密,並且由於此算法僅對0-255之間的數字進行操作,因此我希望儘可能使用安全代碼並正確使用unsigned char變量而不是簡單的int。那麼,這雖然面臨着一種情況,但我不能預料會發生什麼。使用無符號字符算術

給出的是3瓦爾ijk

unsigned char i = 150; 
unsigned char j = 155; 
unsigned char k = 0; 

會表達k = (i + j) % 256正確設置k49255i+j被截斷?

編輯:固定的「J」被拼寫爲「K」

+0

'i + k'是150,你錯誤地輸入了哪個變量? –

+0

這裏有*沒有序列*你可以在這裏做的產生50.無符號字符的算術是mod 256,而不是mod255. – nneonneo

+0

更好地使用'uint8_t'或者你特別定義的類型來保存8位。 'unsigned char'在某些機器上包含8位以上(例如TMS320C28xx上的16位)。 – starblue

回答

4

上的無符號整數類型的標準保證算術爲算術模2^N其中N是在類型值的比特數,所以算術將是正確的。

第3.9.1節(4)的C++ 11標準的n3376草案:

無符號整數,宣告無符號,應當服從算術模的法律2 Ñ其中n是該特定大小的整數值表示中的位數。 46)

46)這意味着因爲不能由所得到的無符號整數類型所表示的結果是減少了無符號算術不會溢出模比可表示的最大值的一個更大的數由生成的無符號整數類型。

+0

這是真的,但無關緊要;在給定的例子中沒有任何截斷或溢出。 – servn

+0

現在有(如果'CHAR_BIT == 8'),'i = 150'和'j = 155','i + j'不可表示,所以發生模256的減法(當然不會產生50 ,但49,好吧,它很接近)。然而,它只能在一個地方固定。 –

+0

整數提升意味着i + j以int類型生成值305。 – servn