2010-06-24 3 views
11

for 루프가 완료 될 때까지 정수 값을 계속 증가시킵니다. 따라서 한계 n이 이중 변수이고 증가 된 변수 'i'가 정수이면 i는 한계를 초과하여 증가합니다.정수 값을 정수 제한값 이상으로 증가 - C#

double total = 0; 
double number = hugetValue; 
for (int i = 1; i <= number; i++) 
{ 
    total = total + i; 
} 
return total; 

용량이 초과되면 'i'가 어떻게됩니까? 어떻게하면 가치가 변하는가? 런타임 오류가 발생합니까?

감사

NLV

+1

어떤 언어입니까? – sharptooth

+0

제목을 편집했습니다. – NLV

+1

질문에 C# 태그를 추가했습니다. 좀 더 도움이되는 어떤 사람들에게는 (적어도 나를 위해). SO를 사용하면 태그를 기준으로 입력/출력을 필터링 할 수 있으며 태그를 기반으로 질문 목록을 얻을 수 있습니다. 대부분의 시간 동안 나는 관심있는 특정 태그만을보고 자주 태그에 관계없이 가장 최근의 질문 목록을 얻습니다. –

답변

8

int이 INT_MAX에서 INT_MIN으로 랩핑되는 C의 일부 implication의 경우와 유사하지만 (ISO 표준에 따라 실제로 정의되지 않은 동작 임) C#도 랩핑됩니다. VS2008에서 테스트 :

int x = 2147483647; 
if (x+1 < x) { 
    MessageBox.Show("It wrapped..."); 
} 

메시지 상자가 나타납니다.

hugetValue이 최대 값 인 int보다 큰 경우 루프가 영구적으로 실행됩니다. 예를 들어

, 그것은 당신이 -2147483648 다시 2147483647에서 int 랩의 주위에, 그것은 가까운 얻고있는 루프 그냥가는 계속 생각하는 것처럼, 2147483648 있다면.

+0

C#으로 썼습니다. 죄송합니다. 나는 너의 대답을 이해하지 못한다. – NLV

+0

@NLV : 일부는 C#을 사용합니다. – leppie

+0

@NLV : C# 태그를 포함하도록 질문을 편집했습니다. 많은 질문에서 언어는 중요합니다 (일부는 암시 적으로 변환을 허용하고 일부는 컴파일 할 때 허용하지 않음). 합리적인 조건으로 귀하가 제공하는 더 많은 정보를 질문 할 때 더 좋습니다. –

3

사과를이 무례한 것 같다,하지만 당신이 직접 시도하여 훨씬 더 배울 경우.

편집 됨 : 아하, 시도 했으므로 예기치 않은 결과가 발생했습니다. 다른 곳에서 설명했듯이 C와 같은 언어는 정수 연산을 조용히 감싸는 경향이 있습니다. 오버플로를 확인하는 비용이 높으면 일반적으로 실제로 상당히 합리적인 행동입니다. 일단 이것이주의 깊게 일어날 수 있다는 것을 알게되면, 특히 당신의 예제에서 어떤 종류의 구조를 관찰하십시오.

+0

올바른 방향으로 가져 왔습니다. 나는 실제로 그것을 시도하고 무한 루프에 갇혔다. 내가 그것을 디버깅 할 때 나는 i의 가치가 음수라는 것을 알았다. 왜 dint가 오류를 던지고 루프를 계속 반복하는지 궁금합니다. 그 이유는 무엇입니까? – NLV

+0

여기에는 두 가지 문제가 있습니다. 왜 변환에서 음수가 나오고 컴파일러가 음수 값의 조건에 대해 불만을 나타내지 않는 이유는 무엇입니까? 최신은 더 간단합니다 : 루프 내에서 루프 변수를 수정하여 음수로 만들 수 있습니다. 이 문제가 발생했는지 여부를 감지하는 것은 컴파일러가 시도하기에는 너무 복잡한 문제이므로 원하는 내용을 알고 있다고 가정합니다 (또는 무한 루프에 빠졌을 때 곧 찾을 수 있습니다). –

2

예외를 원할 경우 checked 컴파일러 옵션을 제공하거나 C#에서 제공되는 checked 구조체를 사용하십시오.

+0

소스를 인용하기 만하면됩니다 : http://msdn.microsoft.com/en-us/library/a569z7k8.aspx 기본적으로 모든 작업은 체크되어 있지 않습니다. 양쪽 모두에 상수를 사용하지 않는 한 컴파일 타임에 체크됩니다. –