在做16位芯片(32位数据线)阵列运算器的测试时,需要用Visual Studio写C程序做大整数的加减乘除相关的运算。
发现一个奇怪的现象:
两个32位的数据相乘,放入一个64位的变量中,乘出来的结果64位,高32位全清零了。这不对?
两个16位的数据相乘,放入一个32位的变量中。乘出来的结果32位,都是正确的。
如何得到两个32位的数据相乘的正确结果呢?
做32位的数据的乘法的时候,先将32位的两个乘数扩展为64位的,再乘。
unsigned short a=0xffff;
unsigned short b=0xffff;
unsigned int c=a*b; //乘积是正确的
unsigned long aa=0xffffffff;
unsigned long bb=0xffffffff;
unsigned long long cc=a*b; //乘积的高32位清零了
unsigned __int64 cc=a*b; //乘积的高32位清零了
unsigned long long cc=(unsigned long long)aa*(unsigned long long)bb //OK了