2014-01-25 2 views
0

C를 사용하여 온라인 판사가 문제를 해결하면서이 문제를 발견했습니다.int에 대한 연산을 수행하면 결과가 int에 임시 저장됩니까?

제약 : 내가 INT로 t를 선언 할 때 t < = 10 9
는 내가 잘못된 대답을 가지고, 내가 오래 오래 같이 선언 할 때 대답은 허용. I 오류가 제공되는, 아마도 12 * t - 3 일시적으로하지만, int 형에 저장되어지고 있다고 생각했다

m = (-3 + sqrt(12*t - 3))/(float)6 ; 

:

이 솔루션은 다음과 같은 수학 계산을 포함한다. 누군가 나에게 맞는지 말해 줄래?

+0

yup..it 가능성이 있습니다. .compiler는 정수 제한을 초과하는 t = 10^9 인 테스트 케이스를 확인합니다. –

+0

"WA"와 "AC"의 의미를 알아야합니까? 그것들은 어떤 종류의 오류 메시지입니까? – Gabe

+0

't'의 데이터 유형은 무엇입니까? –

답변

4

예. int보다 작은 형식은 계산 전에 int (또는 unsigned int)으로 승격되지만, int의 계산은 새 int이됩니다.

결과가 int으로 오버플로되면 적어도 하나의 피연산자가 결과를 저장할만큼 큰 유형인지 확인하는 것이 가장 좋습니다.

+0

여기서 주목할 것은'12 * 1000000000'는'int'를 오버플로하여 잘못된 답을 유도한다는 것입니다. – Gabe

+0

@Gabe : 글쎄,'int'는 그것을 잡을만큼 충분히 크게 허용되지만, 일반적으로 그렇지 않습니다. –

0

t가 int 인 경우 12*t은 int입니다. C 식의 형식 유추는 아래에서 위로 향하고 있습니다. 즉, 12 * t의 (임시) 결과가 32 비트 정수 레지스터에 저장되고 한계 (2E + 9 정도)를 초과하여 오버플로하고 잘못된 결과를 얻는다는 의미입니다. 영리한 컴파일러가 코드에 대해 경고 할 수도 있습니다. 왜냐하면 코드에서 이런 경우가 발생할 수 있기 때문입니다.

t를 long long으로 선언하면 범위가 최대 2^63이며 8E + 18과 같습니다. 이 경우에도 12*t이라는 표현식은 long long이며 64 비트 레지스터 (또는 컴퓨터에 64 비트 레지스터가없는 경우 한 쌍의 32 개 레지스터)에 저장되며 표현식이 올바른 결과를 제공합니다.

+0

컴파일러는 얼마나 큰't'가 될지 알지 못합니다 ... –

+0

확실히 32 비트 정수의 한계는 2^31 또는 2^32이고 확실하게 2 * 2^9는 2^10입니까? – kfsone