您好,匿名用户
随意问技术百科期待您的加入

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

0 投票

最近看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移位,数据溢出后数据本身是如何变化的呢?

用户头像 提问 2012年 12月1日 @ Varus 上等兵 (281 威望)
分享到:

你的回答

隐私保护: 您的邮箱仅用于发送系统通知。
请输入验证码:
    图片验证码看不清?
登录注册后不会被要求输入验证码。

提一个问题:

相关问题

0 投票
1 回复 32 阅读
用户头像 提问 2012年 12月1日 @ Volibear 上等兵 (259 威望)
0 投票
1 回复 10 阅读
0 投票
1 回复 52 阅读
用户头像 提问 2012年 12月1日 @ Scorpio 上等兵 (220 威望)
0 投票
1 回复 45 阅读
+1 投票
1 回复 312 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...