2011-02-17 3 views
3

어제 인터뷰에서 면접관이 나에게 질문을했습니다.다음 코드가 원하는 답변을 제공하지 않는 이유는 무엇입니까?

왜 다음 코드가 원하는 답을 제공하지 못합니까?

int a = 100000, b = 100000; 

long int c = a * b ; 

언어는 우리가 먼저 INT (오버 플로우)과 100,000 * 100,000 카운트 그냥 다음 긴으로 캐스팅 면접관을 말 했어요 C.

입니다.

+1

어떤 언어를 사용했는지 모르겠지만 C#으로 시도했지만 제대로 작동합니다. 당신은 C#, C++ 및 c 태그.좀 더 구체적으로하십시오 – Christian

+0

질문은 원하는 대답이 무엇인지 말하는 것없이 우리가 매일 여기에서 보는 "작동하지 않는"질문 중 일부처럼 들리지만 자세한 내용은 우유를 지루하게해야합니다. 그것은 대답 * I * 욕망을 생산하는 것 같습니다. @ 크리스티안 : 확실합니까? 내 C# 컴파일러는이 코드를 컴파일하는 것을 거부합니다. –

+2

Visual C++ 9에서 테스트 해본 결과 예상대로 100M이되었습니다. 뭐가 문제 야? – sharptooth

답변

5

나는 그 단서가 integer overflow이 될 것이라고 추측하고 있지만, 그런 낮은 값을 가지고는 그런 일이 일어나지 않는다.

최대 INT (일반적으로 32 비트)에 대한 (긍정적) 값은 다음과 같습니다 2,147,483,647

당신의 계산 결과는 다음과 같습니다 100,000,000

업데이트 : 업데이트 된 질문

: 100000 * 10000010000 * 10000 대신에 10000000000이되며, 일 때 overf 발생할 낮은. 이 값은 그 후 long으로 변환됩니다.

이러한 오버플로를 방지하려면 곱셈의 두 값 중 하나를 long (일반적으로 64 비트)로 변환해야합니다. 예 : (long)100000 * 100000

+1

C#에서는'int'가 항상 32 비트로 서명 되었기 때문에 그렇지 않습니다. C 또는 C++에서 'int'는 시스템에 따라 8 비트만큼 작을 수 있습니다. – Thomas

+0

@ 토마스 : 그래, 그걸 깨달았 어. 그래서 나는 빨리 "일반"_을 추가했다. :) –

+1

@ 토마스 : int는 8 비트만큼 작고 [-32768,32767] 범위의 정수 값을 유지할 수 있습니까? –

5
첫 int로서 산출하고, 그래야만. 긴 가변으로 캐스트 (그래서 먼저 정수 오버플하고 긴된다) 원인이다

코드되어야

long int c = a*(long int)b; 
+2

그것은 여전히 ​​정확한 답을 제공합니다. 질문은 잘못되었다. 그것은 "왜 당신의 눈동자를 키울까요?") – stefan

+0

@stefan 정확히! 이 특정 코드는 작동하지만 오버플로에 대한 일반적인 생각은 아마도 인터뷰 담당자가 수행 한 것일 수 있습니다. – Christian

+0

물론 16 비트 int를 가진 머신에서만 실패합니다. –

3

100000*100000 따라서 32 비트 int을 나타낼 수있는 최대 값 (2,147,483,647)보다 큰 10000000000 (10,000,000,000) overflows 그 것이다. 이 변환은 a*b 후에 일어날 것이 평가 된 때 결과 :

a*b 표현 a*b의 회원 유형 int의 모두 이후 따라서 그들이 long int로 변환되지 않습니다,하는 long int 아니라, 여전히 int입니다 c이 지정됩니다. 당신이되고 a*b의 결과를 원하는 경우 long int 당신이 long int으로 피연산자 중 적어도 하나를 변환해야합니다

long int c = (long int)a * (long int)b. 

는 또한 long intint의 같은 크기의 수 (이를도 32 비트에 표현 될 수 있음) 이것은 일반적으로 sizeof(int) == sizeof(long int) == 4 인 32 비트 응용 프로그램에서 발생할 가능성이 큽니다.

c이 64 비트가되어야하는 경우 int64_t과 같은 변수를 사용하면 64 비트가되어야합니다.

관련 문제