이번 학기에 나는 시스템 프리 래밍 코스를 택했습니다. 왜 50000 * 50000이 부정적입니까? 나는이 논리를 이해하려고 노력한다. 여기 슬라이드의 스크린 샷이다두 개의 양의 정수가 음수 인 이유는 무엇입니까?
답변
대부분의 프로그래밍 언어에서 정수 데이터 형식은 고정 된 크기를 갖기 때문입니다.
즉, 각 정수 값에 정의 된 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에서 일어나는 일이 바로 다음 값에서 최대 값과 루프를 넘습니다.
정확한 최소값과 최대 값은 사용 된 언어, 코드가 작성된 플랫폼, 코드가 실행되는 플랫폼 및 값의 정적 유형에 따라 다릅니다.
희망은 모든 것을 지워줍니다.
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 비트보다 높은 비트를 포함해서는 안됩니다.
샘플 프로그램 의사 코드
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
- 1. eig (A) 함수 (A가 양의 semidefinite 함수 인)가 음수 복 값을 반환하는 이유는 무엇입니까?
- 2. 2147483647보다 큰 양의 정수가 여전히 throw됩니다. InvalidArgumentException
- 3. 왜 pow (-infinity, 양의 정수가 아닌) + 무한대입니까?
- 4. 정수가 숫자 인 경우 파이썬
- 5. 2의 보수를 사용하여 두 개의 음수 추가하기
- 6. 고정 된 양의 정수가 포함 된 백팩 0-1
- 7. C에서 정수가 ASCII로 변환되지 않는 이유는 무엇입니까?
- 8. 긍정적 인 음수 출력
- 9. 동등한 정수가 동등리스트와 다르게 동작하는 이유는 무엇입니까?
- 10. 두 개의 다른 getline() 함수가있는 이유는 무엇입니까?
- 11. 음수 값이 주어지면 프로그램이 중단되는 이유는 무엇입니까?
- 12. 정수가 NDS의 바이트보다 빠르게 처리되는 이유는 무엇입니까?
- 13. 정수가 Fixnum이란 이름이 루비에있는 이유는 무엇입니까?
- 14. 정수가 4의 배수로 증가하는 이유는 무엇입니까?
- 15. 정수가 둘 다 같지 않은 이유는 무엇입니까?
- 16. 음수 값이 아닌 음수 값이 최소 인 Rxjs 더하기 버튼
- 17. 음수 인 경우 숫자를 ASCII로 지정합니다.
- 18. Prolog : 산술에서 음수 값을 사용하지 않는 이유는 무엇입니까?
- 19. 두 개의 Cordova www 폴더가있는 이유는 무엇입니까?
- 20. 변수 앞에 두 개의 느낌표가있는 이유는 무엇입니까?
- 21. 두 개의 스크롤바가 발생하는 이유는 무엇입니까?
- 22. PlayOrm에 두 개의 진입 점이있는 이유는 무엇입니까?
- 23. 헤더에 두 개의 세션 ID가있는 이유는 무엇입니까?
- 24. 정수가 여러 개의 0이있는 NSString에서
- 25. 음수 인덱스가있는 배열이 작동하는 이유는 무엇입니까?
- 26. 음수 값이 표시되지 않는 이유는 무엇입니까?
- 27. Teradata Identity 열에 음수 값이있는 이유는 무엇입니까?
- 28. 두 개의 완벽하게 좋은 정수가 나뉘어져 있고 여전히 0을 반환합니다.
- 29. 두 개의 레이아웃 /보기가 하나 인 두 개의 레코드가 있습니다.
- 30. AS3 : 2 개의 양의 정수를 추가하면 음의 정수가됩니다.
예제 2에서 우리는 0을 얻었습니다. 우리가 -1e20과 비교하면 3.14가 너무 적습니다. 맞습니까? –
당신은 새로운 질문에 그것을 게시해야하지만 간단한 용어로 대답하기 위해, 수레는 항상 숫자의 가장 중요한 부분을 저장합니다. 그래서 1e20 - 1e20 = 0 및 0 + 3.14 = 3.14. 그리고 다른 한편으로는 -1e20 + 3.14 = 1e20 (원인 3.14는 충분하지 않음) 최종 결과는 0.0입니다. – Atrakeur