70,020
社区成员




#include <stdio.h>
int main()
{
int i, j;
int success = 1;
for( i = -128; i < 128; ++ i)
{
for( j = -128; j < 128; ++ j)
{
int y1 = (int)( i * 1.402 + j);
int y2 = (i * 1402 + j * 1000) / 1000;
//上面就是用整数运算实现的(int)( i * 1.402 + j)
if( y1 != y2 )
{
printf( "\n%d * 1.402 + %d = %d\n(%d * 1402 + %d * 1000) / 1000 = %d\n", i, j, y1, i, j, y2 );
success = 0;
}
}
}
if( success )
{
printf("(int)( i * 1.402 + j) ≡ (i * 1402 + j * 1000) / 1000)\n");
}
getchar();
}
输出为:
(int)( i * 1.402 + j) ≡ (i * 1402 + j * 1000) / 1000)
5: int i = 65535,j = 65535;
004109A8 mov dword ptr [ebp-4],0FFFFh
004109AF mov dword ptr [ebp-8],0FFFFh
6:
7: int x = i*1.402;//
004109B6 fild dword ptr [ebp-4]
004109B9 fmul qword ptr [__real@8@3fffb374bc6a7ef9d800 (00426030)]//用的fmul
004109BF call __ftol (00401208)
004109C4 mov dword ptr [ebp-0Ch],eax
8: int y = i*1.402+j;
004109C7 fild dword ptr [ebp-4]
004109CA fmul qword ptr [__real@8@3fffb374bc6a7ef9d800 (00426030)]
004109D0 fiadd dword ptr [ebp-8]
004109D3 call __ftol (00401208)//有取整的过程
004109D8 mov dword ptr [ebp-10h],eax
9:
10: printf("%d %d\n", x, y);
004109DB mov eax,dword ptr [ebp-10h]
004109DE push eax
004109DF mov ecx,dword ptr [ebp-0Ch]
004109E2 push ecx
004109E3 push offset string "x = i*1.402%s" (0042601c)
004109E8 call printf (004010a0)
004109ED add esp,0Ch
11:
12: x = i*1402/1000;
004109F0 mov eax,dword ptr [ebp-4]
004109F3 imul eax,eax,57Ah//用的是imul
004109F9 cdq
004109FA mov ecx,3E8h
004109FF idiv eax,ecx//用的idiv
00410A01 mov dword ptr [ebp-0Ch],eax
13: y = i*1402/1000+j;
00410A04 mov eax,dword ptr [ebp-4]
00410A07 imul eax,eax,57Ah
00410A0D cdq
00410A0E mov ecx,3E8h
00410A13 idiv eax,ecx
00410A15 add eax,dword ptr [ebp-8]
00410A18 mov dword ptr [ebp-10h],eax
14: printf("%d %d\n", x, y);
00410A1B mov edx,dword ptr [ebp-10h]
00410A1E push edx
00410A1F mov eax,dword ptr [ebp-0Ch]
00410A22 push eax
00410A23 push offset string "x = i*1.402%s" (0042601c)
00410A28 call printf (004010a0)
00410A2D add esp,0Ch
这样楼主应该知道他们处理的差别了吧?
#include <stdio.h>
int main(int argc, char **argv)
{
int i = 65535,j = 65535; //范围都是-128到127;
int x = i*1.402;// 完全等价 int x = i*1402/1000;
int y = i*1.402+j; //有时不等价 int y = i*1402/1000+j;
//发现不等价时 i*1.402+j后改变了符号!
printf("%d %d\n", x, y);
x = i*1402/1000;
y = i*1402/1000+j;
printf("%d %d\n", x, y);
return 0;
}