2012-10-06 57 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