二进制值加起来不正确

Binary values don't add up correctly

本文关键字:不正确 起来 二进制      更新时间:2023-10-16

我正在尝试用c++编写SHA-1的实现。但出于某种原因,我不能让它工作。两个值不能正确相加

我使用这个链接来检查输入test的SHA-1步骤

在函数的第一轮(对于word 0)中,我的代码示例如下:

#define LEFTROTATE(x, c) (((x) << (c)) | ((x) >> (32 - (c))))
a = 0xefcdab89;
b = 0x98badcfe;
c = 0x10325476;
d = 0xc3d2e1f0;
f = (b & c) | (d & (~b));
cout << LEFTROTATE(a, 5); // equal to 3903086636 (11101000101001000110000000101100)
cout << f; // equal to 2562383102 (10011000101110101101110011111110)

我想把这两个值加起来得到LEFTROTATE(a, 5) + f,但我得到以下结果:

cout << LEFTROTATE(a, 5) + f; // equal to 2170502442 (10000001010111110011110100101010)

3903086636 + 2562383102 = 6465469738开始,我期望输出是6465469738 (110000001010111110011110100101010)

这是正常和预期的。SHA1中使用的加法定义为加法模232,这是在添加32位位向量时自然发生的。没有第33位,所以不能设置。

链接页面显示了一些额外的位,但这本质上只是为了显示。它们不影响结果,在这些额外的位有机会影响任何东西之前,它们在该页上被显式地截断了。

实际上这些位本来就不存在,因为截断是隐式的。

变量的类型是什么?如果您使用unsigned int,它们将溢出。考虑使用或强制转换为unsigned long longuint64_t