C++中数据溢出后数据本身是如何变化的?是移高位留低位,还是变成一个随机的数?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

C++中数据溢出后数据本身是如何变化的?是移高位留低位,还是变成一个随机的数?

2016-03-09 18:43:25 2419 1

最近看MD5的代码,看到下面一段有疑惑
部分代码

void CMD5Checksum::Update( BYTE* Input,    ULONG nInputLen )
{
    //Compute number of bytes mod 64
    UINT nIndex = (UINT)((m_nCount[0] >> 3) & 0x3F);
    //Update number of bits
    if ( ( m_nCount[0] += nInputLen << 3 )  <  ( nInputLen << 3) ) 
        //对条件成立的部分有疑惑
    {
        m_nCount[1]++;
    }
    
    m_nCount[1] += (nInputLen >> 29);
        ………………
    // Buffer remaining input
    memcpy( &m_lpszBuffer[nIndex], &Input[i], nInputLen-i);
}

代码功能:Implementation of main MD5 checksum algorithm

其中,m_nCount数组的定义: ULONG m_nCount[2]; //number of bits, modulo 2^64 (lsb first)

用两个32位的数保存不超过64位的明文长度,上诉条件成立的地方,是利用m_nCount[0]数组溢出时,会小于nInputLen,则高位储存一位数据。

要正确的保存数据的长度,只有当m_nCount[0]溢出的时候是mod 2^32 次方时才行。但记忆中int类的数据溢出时会存储一个无规律的大数,那么,是因为nInputLen << 3 语句先让nInputLen移位了,m_nCount[0]操作的对象变成对二进制进行操作,高位就自动溢出达到mod 2^32效果?如何是此原因,当普通的+,-时,即没有后面的 nInputLen << 3移位,数据溢出后数据本身是如何变化的呢?

取消 提交回答
全部回答(1)
  • 大喵Schnitzel
    2019-07-17 18:56:35
    uint i;
    i << 3;

    左移3位直观上相当于这个数乘以8。
    移完后右边三位补零,左边之前的三位就移没了。

    0 0
相关问答

1

回答

数据生态系统是谁提出的呀?

2022-08-03 08:27:03 42浏览量 回答数 1

1

回答

请问这个在哪里改?

2022-06-22 10:32:28 104浏览量 回答数 1

2

回答

在云数据库中如何设置数据库索引?

2021-03-11 23:10:35 1368浏览量 回答数 2

1

回答

你好,我们单位已经实名认证,根据要求更换了名称如何更改。

2019-03-19 14:37:15 173浏览量 回答数 1

3

回答

本地连接数数据库 连接不上

2018-09-06 15:22:50 493浏览量 回答数 3

0

回答

撮合经济、人工智能、大数据与开放生态

2018-06-30 19:21:07 820浏览量 回答数 0

0

回答

用计算和数据去改变整个世界

2018-06-30 19:18:44 850浏览量 回答数 0

1

回答

请问大数据、云计算如何精确定位一个人的位置?

2016-11-24 09:40:15 4504浏览量 回答数 1

1

回答

数据开放

2016-07-20 08:50:56 2383浏览量 回答数 1

9

回答

更换系统后数据在哪里?

2014-06-08 08:46:27 9113浏览量 回答数 9
+关注
0
文章
14879
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载