c – 为什么AND和uint32值为0xFFFFFFFF?

前端之家收集整理的这篇文章主要介绍了c – 为什么AND和uint32值为0xFFFFFFFF?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的一个朋友正在查看 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]++;

我们无法弄清楚这个代码的两个方面.首先,ANDs ctx-> total [0](类型为uint32_t)和0xFFFFFFFF,它不应该做任何事情.在二进制中,这是与所有1的AND,它应该产生相同的值.在我看来,这两行是相同的:

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

如果我是对的,为什么这条线呢?一些安全原因?如果我错了,怎么和为什么?

其次,假设AND没有做任何事情,我们不明白何时会出现这种情况.如果AND什么都不做,则if基本上是:

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

这永远不应该是真的.我们缺少什么?

如果你想看到头文件说服自己ctx-> total [0]是uint32_t类型,或者由于其他原因,你可以找到here.

另外,我的第一个猜测是,当我们将ilen从size_t转换为uint32_t时,会发生一些偷偷摸摸的事情,但我仍然感到困惑和困惑.

解决方法

第一个问题:

你是对的,32位不需要这个& ing,我的猜测是 – 他们试图阻止ctx-> total [0]不是32bit的情况(所以即使有人会改变它或平台会有64位甚至uint32_t类型),所以使用这段代码,他们100%肯定,没有99.99999%:)

第二个问题很简单:

检查此代码如何适用于值ctx-> total [0] == 0xFFFFFFFF和ilen == 1

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

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

猜你在找的C&C++相关文章