小结——从汇编鉴别整形计算是否溢出

文章通过示例代码和汇编语言分析,解释了在整形数据计算中,16位和32位数据乘法是否溢出的情况。16位数据乘法在32位系统中不会溢出,因为计算过程中使用了32位寄存器,而32位数据乘法在同样系统中可能会溢出,因为中间计算结果超过了32位寄存器的范围。
摘要由CSDN通过智能技术生成

        大家都知道整形数据的计算是要考虑计算范围的,否则容易溢出,很多人认为只要两个数据计算的结果超出类型表示的范围就会出现溢出。其实不完全正确,因涉及到寄存器长度、计算顺序、强制转换等知识,从高级语言角度是看不到详细的过程的,所以我们从汇编角度,结合下例进行分析。

例:使用VS2017从32位PC机上运行如下代码:

两个16位整形进行乘法:

int main(void)
{
	unsigned short int a, b;
	unsigned int c;
	a = 0xffff, b = 0xffff;
	c = a * b;
	printf("%u\n", c);

}

运行结果:

 可以看出没有出现溢出的现象。

两个32位整形进行乘法:

int main(void)
{
	// 测试1
	unsigned  int a, b;
	unsigned long long c;
	a = 0xffffffff, b = 0xffffffff;
	c = a * b;
	printf("%llu\n", c);
}

运行结果:

 该代码出现溢出现象,为什么会这样呢?因为存储中间数据的寄存器是32位的,计算结果小于32位就不会出现因溢出导致的结果错误。

从汇编语言分析两个16位整形进行乘法:

a = 0xffff, b = 0xffff;
00007FF60F85576A  mov         eax,0FFFFh  
00007FF60F85576F  mov         word ptr [a],ax  /
00007FF60F855773  mov         eax,0FFFFh  
00007FF60F855778  mov         word ptr [b],ax  
	c = a * b;
00007FF60F85577C  movzx       eax,word ptr [a]  // 取变量a地址16位数据导入到32位寄存器eax
00007FF60F855780  movzx       ecx,word ptr [b]  // 取变量b地址16位数据导入到32位寄存器ecx 
00007FF60F855784  imul        eax,ecx           // 32位寄存器eax与ecx相乘,结果存在eax中
00007FF60F855787  mov         dword ptr [c],eax //  c=eax

从汇编语言分析两个32位整形进行乘法:

a = 0xffffffff, b = 0xffffffff;
00007FF6AB41576A  mov         dword ptr [a],0FFFFFFFFh  
00007FF6AB415771  mov         dword ptr [b],0FFFFFFFFh  
	c = a * b;
00007FF6AB415778  mov         eax,dword ptr [a]  // 取变量a地址32位数据导入到32位寄存器eax
00007FF6AB41577B  imul        eax,dword ptr [b]  // 取变量b地址32位数据导入到32位寄存器eax
00007FF6AB41577F  mov         eax,eax            // eax=eax*eax
00007FF6AB415781  mov         qword ptr [c],rax  // c=eax

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿来不是梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值