2012-02-22 4 views
3

이 코드는 32 비트 * 32 비트를 곱합니다.C#의 32 비트 * 32 비트 데이터 문제

public static void RunSnippet() 
{ 
    System.Int32 x, y; 
    System.Int64 z; 

    System.Random rand = new System.Random(DateTime.Now.Millisecond); 
    for (int i = 0; i < 6; i++) 
    { 
     x = rand.Next(int.MinValue, int.MaxValue); 
     y = rand.Next(int.MinValue, int.MaxValue); 
     z = (x * y); 
     Console.WriteLine("{0} * {1} = {2}", x, y, z); 
    } 

그러나 예상 한 결과가 아닙니다.

enter image description here

이 문제점은 무엇입니까?

답변

10

오버 플로우. 결과는 32 비트 정수로 계산 된 후 64 비트로 승격됩니다. 이를 방지하려면 곱하기 전에 인수를 64 비트로 변환하십시오.

System.Int32 x, y; 
System.Int64 z; 

System.Random rand = new System.Random(DateTime.Now.Millisecond); 
for (int i = 0; i < 6; i++) 
{ 
    x = rand.Next(int.MinValue, int.MaxValue); 
    y = rand.Next(int.MinValue, int.MaxValue); 
    z = ((Int64)x * y); //by casting x, we "promote" the entire expression to 64-bit. 
    Console.WriteLine("{0} * {1} = {2}", x, y, z); 
} 
0

Int32 * Int32는 다른 Int32를 산출합니다. 그 결과는 범람하고 있습니다.

보십시오 승산에 Int64

System.Int64 x, y; 
1

전송 X 또는 Y 중 하나. 곱셈의 출력은 대상 유형이 아닌 소스 유형을 기반으로합니다.

0

INT32 * INT32 == INT32 당신은 곱셈

(INT64) INT32 * (INT64) INT32 == INT64

전에 INT64에 x와 y를 캐스팅 할 필요가