c - 为什么 AND 一个带有 0xFFFFFFFF 的 uint32 值?

标签 c bit-manipulation

我的一个 friend 正在浏览 this open-source SSL code在处理 SHA 加密的函数中,注意到这个奇怪的片段:

ctx->total[0] += (uint32_t) ilen;         // ilen is of type size_t
ctx->total[0] &= 0xFFFFFFFF;              

if( ctx->total[0] < (uint32_t) ilen )
    ctx->total[1]++;

关于这段代码,我们无法弄清楚两件事。首先,它将 ctx->total[0](uint32_t 类型)与 0xFFFFFFFF 进行 AND 运算,这不应该执行任何操作。在二进制中,这是与所有 1 的 AND 运算,它应该产生相同的值。那么,在我看来,这两行是相同的:

ctx->total[0] &= 0xFFFFFFFF;
ctx->total[0] =  ctx->total[0];

如果我是对的,为什么会有这条线?一些安全原因?如果我错了,怎么错的以及为什么?

其次,假设 AND 不执行任何操作,我们不明白 if 何时会为真。如果 AND 什么都不做,那么 if 本质上是:

if (ctx->total[0] < ctx->total[0])

这永远不会是真的。我们缺少什么?


如果您想查看头文件以说服自己 ctx->total[0]uint32_t 类型,或者出于任何其他原因,您可以找到那here .

此外,我的第一个疯狂猜测是当我们将 ilensize_t 转换为 uint32_t 时发生了一些偷偷摸摸的事情,但我仍然陷入困境和困惑。

最佳答案

第一个问题:

你是对的,32 位不需要这个 &ing,我的猜测是 - 他们试图防止 ctx->total[0] 不是 32 位的情况(所以即使有人将更改它,否则即使对于 uint32_t 类型,平台也将具有 64 位),因此使用此代码,他们 100% 确定,没有 99.99999% :)

第二个问题很简单:

检查此代码如何处理值 ctx->total[0] == 0xFFFFFFFFilen == 1

ctx->总[0] += (uint32_t) ilen;//这会溢出并且 total[0] 现在为 0

if( ctx->total[0] < (uint32_t) ilen ) // 0<1 true
    ctx->total[1]++;

关于c - 为什么 AND 一个带有 0xFFFFFFFF 的 uint32 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19500687/

相关文章:

c - char array[] = "string"的底层机制是什么?

c++ - 在 C/C++ 中快速实现/逼近 pow() 函数

java - 如何用Java在字节数组和位数组之间进行转换?

python - 如果 Python3 否定与 XOR 相比,为什么它运行得更快?

c++ - C++ 中 MSB ->LSB 和 LSB->MSB 的带符号 INT 转换

c++ - 我如何检查重构时我没有破坏任何东西?

在 AIX 上编译 netcat

c++ - 如何使用 libssh 和 SFTP 在 C/C++ 中复制文件

java - Hackerrank 位翻转挑战

python - 将 numpy.array 向右旋转一位