2017-09-28 2 views

답변

0

대부분의 프로그래밍 언어에서 정수 데이터 형식은 고정 된 크기를 갖기 때문입니다.

즉, 각 정수 값에 정의 된 MIN 및 MAX 값이 있음을 의미합니다. C#을 MAX INT의 예를 들어

는 2147483647이며, MIN은 2147483647입니다 PHP 32 비트에서 -2147483648 및 PHP에서 -2147483648 당신이 있음을 가서 할 때 일이 무엇 9223372036854775807 및 -9223372036854775808

의 64 비트 값? 간단히 말해 컴퓨터는 정수 오버플로 (integer overflow)라고 불리는 것을 만들 것이고 값은 최소값으로 되돌아 갈 것입니다.

즉, C# 2147483647 + 1 = -2147483648 (long 또는 float이 아닌 정수 데이터 유형을 사용한다고 가정). 정확히 50000 * 50000에서 일어나는 일이 바로 다음 값에서 최대 값과 루프를 넘습니다.

정확한 최소값과 최대 값은 사용 된 언어, 코드가 작성된 플랫폼, 코드가 실행되는 플랫폼 및 값의 정적 유형에 따라 다릅니다.

희망은 모든 것을 지워줍니다.

+0

예제 2에서 우리는 0을 얻었습니다. 우리가 -1e20과 비교하면 3.14가 너무 적습니다. 맞습니까? –

+0

당신은 새로운 질문에 그것을 게시해야하지만 간단한 용어로 대답하기 위해, 수레는 항상 숫자의 가장 중요한 부분을 저장합니다. 그래서 1e20 - 1e20 = 0 및 0 + 3.14 = 3.14. 그리고 다른 한편으로는 -1e20 + 3.14 = 1e20 (원인 3.14는 충분하지 않음) 최종 결과는 0.0입니다. – Atrakeur

1

32 비트 부호있는 정수를 비트 수가 0-30를 사용하여 저장 수의 부호를 나타내는 31 비트된다.

즉, 표현할 수있는 최대 값은 2,147,483,647 (0-30의 모든 비트가 설정되고 비트 31은 양수를 나타냄)입니다.

50,000과 50,000의 곱이 25,000,000,000보다 크고 오버플로가 있습니다. 이것은 데이터가 예상되는 경계 (아래쪽 31 비트)에서 부호 비트로 "오버플로"되었음을 의미합니다.

이제 비트 31이 설정되어 음수임을 나타냅니다. 이진 표현에서 음수를 계산하려면, 자의 보완 (모든 비트 뒤집기)을 취하고, 하나를 더한 다음 앞에 음수 기호를 던집니다. 당신이 32 비트 범위에 자신을 제한하는 1의 보수를 취할 때

하는 것은 조심 ... 당신은 자세한 내용은 31

체크 아웃 signed number representations 비트보다 높은 비트를 포함해서는 안됩니다.

1

샘플 프로그램 의사 코드

Print --> ("Size of int: " + (Integer.SIZE/8) + " bytes."); 
int a=50000; 
int b=50000; 
Print --> (" Product of a and b " + a*b); 

Output : 
Size of int: 4 bytes. 
Product of a and b:-1794967296 

분석 : 4 바이트 = 4 * 8 =의 32 비트.

부호가있는 int는 음수 값을 가질 수 있으므로 부호 (- 또는 +)에 1 비트가 사용되므로 숫자 범위 = 31에 사용할 수있는 비트가 사용됩니다. 숫자 범위는 = - (2^31), 0 (^ 31-1 2)

-2147483648 0 2147483647

가능한 최대 포지티브 INT = 2147483647 [하나 개 양수 0 희생] 많은 휴대용 C 프로그램이 부호있는 정수 오버 플로우가 안정적으로 2의 보수 연산을 사용하여 주위를 감싸고 있다고 가정 실제 제품 (2147483647 이상) 50,000 * 50,000 = 2,500,000,000

실제로 (이상 1600000000, 그래서 40000 * 40000 괜찮습니다). 그러나 C 표준에서는 오버플로에서 프로그램 동작이 정의되지 않았으며 일부 경우 C 프로그램은 일부 최신 구현에서는 작동하지 않습니다. 왜냐하면 오버플로가 작성자가 예상 한대로 줄 바꿈하지 않기 때문입니다. http://www.gnu.org/software/autoconf/manual/autoconf-2.62/html_node/Integer-Overflow.html

관련 문제