정수의 최대 값


291

C에서 정수 (32 비트 시스템의 경우)는 32 비트이며 범위는 -32,768에서 +32,767입니다. Java에서 정수 (long)도 32 비트이지만 범위는 -2,147,483,648에서 +2,147,483,647입니다.

비트 수는 동일하지만 Java에서 범위가 어떻게 다른지 이해하지 못합니다. 누군가 이것을 설명 할 수 있습니까?


35
Java에서 int의 최대 값과 최소값을 얻으려면 Integer.MAX_VALUE 및 Integer.MIN_VALUE
live-love를 사용하십시오.

5
@stackuser-귀하의 질문에 대한 좋은 답변-하나를 받아 들여야합니다 :)
Darragh Enright

2
@DarraghEnright 그가 2015 년 3 월에 마지막으로봤을 때, 그가 돌아온 것 같지 않다 :(
Ungeheuer

4
@Adrian haha-나는 추측하지 않는다! 내가 생각하는 약간의 일이 일어난다. 나는 항상 특정 조건에서 SO가 자동으로 답변을 자동 수락 할 수 있다고 생각했습니다. 질문이 특정 연령 이상인 경우 OP는 AWOL이며 많은 찬성 투표로 명확하게 유용한 답변이 있습니다.
Darragh Enright

2
@DarraghEnright 동의합니다. 그러나 OP는 ~ 2 주 전에 이곳에 왔으며, 수락 할 기회를 얻었으므로 기술적으로 그는 떠나지 않았습니다.
gaborsch

답변:


394

에서 C , 언어 자체가 특정 데이터 유형의 표현을 결정하지 않습니다. 시스템마다 다를 int수 있으며 임베디드 시스템에서는 너비가 16 비트 일 수 있지만 일반적으로 32 비트입니다.

유일한 요구 사항은 short int<= int<= long int크기입니다. 또한 int프로세서의 기본 용량을 나타내는 권장 사항이 있습니다.

모든 유형이 서명됩니다. unsigned수정하면 (그렇지 않으면 부호 비트를 위해 예약되어 있습니다) 값의 일부로서 가장 높은 비트를 사용할 수 있습니다.

가능한 데이터 유형에 가능한 값에 대한 간단한 표는 다음과 같습니다.

          width                     minimum                         maximum
signed    8 bit                        -128                            +127
signed   16 bit                     -32 768                         +32 767
signed   32 bit              -2 147 483 648                  +2 147 483 647
signed   64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807
unsigned  8 bit                           0                            +255
unsigned 16 bit                           0                         +65 535
unsigned 32 bit                           0                  +4 294 967 295
unsigned 64 bit                           0     +18 446 744 073 709 551 615

에서 자바 , Java 언어 사양은 데이터 유형의 표현을 결정한다.

순서는 byte8 비트, short16 비트, int32 비트, long64 비트입니다. 이러한 모든 유형은 signed 이며, 서명 되지 않은 버전은 없습니다. 그러나 비트 조작은 숫자를 부호가없는 것으로 처리합니다 (즉, 모든 비트를 올바르게 처리).

문자 데이터 유형 char은 너비가 16 비트이고 부호가 없으며 UTF-16 인코딩을 사용하여 문자를 보유합니다 (그러나 char유효하지 않은 문자 코드 포인트를 나타내는 임의의 부호없는 16 비트 정수 를 지정할 수 있음)

          width                     minimum                         maximum

SIGNED
byte:     8 bit                        -128                            +127
short:   16 bit                     -32 768                         +32 767
int:     32 bit              -2 147 483 648                  +2 147 483 647
long:    64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807

UNSIGNED
char     16 bit                           0                         +65 535

10
C 표준은 또한 INT_MAX, LONG_MAX 등에 대한 최소값을 지정합니다.
Oliver Charlesworth

13
자바 8은 지금뿐만 아니라 부호없는 정수가 있습니다 docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
야쿱 Kotowski는

4
고맙습니다, @jkbkot, 잘 알고 있습니다. 표현은 여전히 ​​서명 된 것처럼 보이지만 서명되지 않은 특정 작업은 함수로 구현됩니다. 서명되지 않은 두 개를 추가하는 것은 어렵습니다 int.
gaborsch

5
@GaborSch Java에서 int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));인쇄물 2147483648문자 는 부호가없는 유형입니다
howlger

2
@howlger Integer.MAX_VALUE + 10x80000000오버플로로 인해 16 진입니다 (및 같음 Integer.MIN_VALUE). 부호없는 (길게)으로 변환하면 부호 비트는 값 비트처럼 취급되므로 2147483648. char메모 주셔서 감사합니다 . char서명되지 않았습니다. 맞습니다. 그러나 char은 실제로 계산에 사용되지 않으므로 목록에서 제외했습니다.
gaborsch

73

C에서 정수 (32 비트 시스템)는 32 비트이며 범위는 -32768에서 +32767입니다.

잘못된. 2의 보수 표현에 32 비트 정수의 범위가 -2 31 2 31 -1 2,147,483,647 -2,147,483,648 동일하다.


3
나는 당신의 지수를 고쳤 **으며 C조차도 아니고 내 의견으로는 명확하지 않습니다. :)
풀기

2
감사합니다! 너무 많은 파이썬이라고 생각합니다. 나는 ^보통이기 때문에 피 하십시오xor
Kos

5
내 요점은 C에 지수 연산자가 없기 때문에 특정 조각이 코드로 포맷되어야한다고 생각하지 않는다는 것입니다. :)
언 와인드

19

32 비트 정수 범위는 -2,147,483,648에서 2,147,483,647입니다. 그러나 32 비트 시스템을 C사용 한다고해서 컴파일러가 32 비트 정수를 사용 한다는 것은 아닙니다 .


1
적어도 Kernighan 씨와 Ritchies 씨 "C 프로그래밍 언어"의 사본은 A4.2에서 " int기계의 자연 너비 "라고 말하며 32 비트 기계에 대해 컴파일 할 때 32 비트로 해석됩니다.
junix

7
이것은 내가 믿는 기계가 아닌 컴파일러에 달려 있습니다. 예를 들어 64 비트 시스템에 16 비트 컴파일러가 설치되어 있습니다.
Ivaylo Strandjev

물론 16 비트 x86 코드 용 16 비트 컴파일러는 16 비트 만 사용했습니다. 그러나 그것은 내 요점이 아니었다. 16 비트 모드에서 실행되는 32 비트 x86 프로세서조차도 기본 용량 만 16 비트입니다. 내 요점은 컴파일러가 가지고있는 대상 플랫폼이 중요하다는 것입니다. 예를 들어 80286 용 컴파일러가 있으면 16 비트 코드를 생성하므로 16 비트 정수가 있습니다.
junix

2
@junix 나는 그것이 내가 대답에서 지적한 것과 정확히 일치한다고 믿습니다. 정수의 비트 수를 지정하는 것은 OS가 아닙니다. 대상 플랫폼은 작업중인 OS 또는 사용중인 프로세서가 아니라 컴파일러의 속성입니다.
Ivaylo Strandjev

내가 첫 번째 의견을 썼다. "32 비트 머신 용으로 컴파일 할 때 32 비트입니다." "(32 비트 시스템 용) 정수"자신의 게시물의 영업 쓰기 그래서 그는 자신의 타겟 플랫폼에 어떤 나는 그가 자신의 OS, 또는 자신의 컴퓨터에 언급되지 않은 이해를 참조한다에서
junix

15

C 언어 정의 는 다양한 데이터 유형에 대한 최소 범위를 지정합니다 . 의 int경우이 최소 범위는 -32767 ~ 32767이며 너비가 16 비트 이상int 이어야합니다 . 구현은 더 넓은 범위를 갖는 더 넓은 유형을 자유롭게 제공 할 수있다 . 예를 들어, 내가 작업하는 SLES 10 개발 서버에서 범위는 -2147483647에서 2137483647입니다.int

16 비트 int유형 (All The World Is A VAX x86 은 아님) 을 사용하는 시스템이 여전히 있지만 32 비트 유형을 사용하는 시스템이 많고 64 비트를 사용하는 시스템 이 많이 있습니다 . int

C 언어는 다른 아키텍처에서 실행되도록 설계되었습니다. Java는 이러한 구조적 차이를 숨기는 가상 머신에서 실행되도록 설계되었습니다.


16 비트 int의 경우 -3276 8 ~ 32767입니다. 32 비트 int의 경우 -214748364 8 ~ 2147483647입니다. 범위는 -2 ^ (n bits-1) ~ + 2 ^ (n bits-1 )-1.
신화

3
@Maven : 5.2.4.2.1- INT_MIN로 지정됩니다 -32767. 2의 보수를 가정하지 마십시오.
John Bode

8

Java와 동등한 int것은 long intC입니다.

편집 : int32_t정의 된 경우 정밀도 측면에서 동등합니다. 크기는 32 비트 이상이어야하므로 long intjava의 정밀도를 보장합니다 int.


당신의 말이 맞습니다. int32_t컴파일러에 의해 정의 된 경우 와 동일 합니다
UmNyobe

7

32 비트 머신의 C-정수는 32 비트가 그것을 저장하는 데 사용된다는 것을 의미하지 않기 때문에 16 비트 일 수도 있습니다. 기계에 따라 다릅니다 (구현에 따라 다름).


1
글쎄, 전형적인 구현 행동은 "machine width"를 위해 사용된다는 점에 주목할 가치가있다 int. 그러나 limits.h정확한 진실을 찾는 데 도움이됩니다
junix

3
그러나 실제로 32 비트의 C 컴파일러가 32 비트만큼 int없이 만들어 졌다고 생각하지 않습니다. 표준은 int의 컴파일러 구현이 모 론적 성격을 갖도록 허용 할 수 있지만, 어떤 이유로 든 모 론적 C 컴파일러를 만들고자하는 사람은 없습니다. 트렌드는 유용한 C 컴파일러를 만드는 것입니다.
룬딘


4

실제로 비트의 크기는 int, short, long 컴파일러 구현에 의존한다.

예를 들어 내 우분투 64 비트 short에서 32비트 단위로 다른 32 비트 우분투 버전에서는 16비트입니다.


1

__int32의 C 범위는 –2147483648 ~ 2147483647 입니다. 전체 범위는 여기를 참조하십시오.

unsigned short 0 to 65535
signed short 32768 to 32767
unsigned long 0 to 4294967295
signed long 2147483648 to 2147483647

특정 크기의 변수를 사용하려는 경우, 특히 비트 조작과 관련된 코드를 작성할 때 'int'가 32 비트 일 것이라는 보장은 없습니다. 'Standard Integer Types'를 사용해야합니다.

자바에서

int 데이터 형식은 32 비트 부호있는 2의 보수 정수입니다. 최소값은 -2,147,483,648이며 최대 값은 2,147,483,647입니다 (포함).


2
C에 대해 인용 한 값은 최소 범위입니다.
Oliver Charlesworth

@OliCharlesworth 최소에서 최대까지의 범위.
Achintya Jha

6
의미하는 바는 각 유형의 범위가 위에서 인용 한 것보다 클 수 있다는 것입니다.
Oliver Charlesworth

3
C에는 __int32라는 것이 없습니다. Microsoft는 C 컴파일러를 엄격하게 준수하지 않으므로 누가 비 C 컴파일러가 작동하는 방식에 관심이 있습니까? 유일한 관련 소스는 ISO9899입니다. 5.2.4.2.1 "정수 유형의 크기"또는 7.20.2.1 "정확한 정수 유형의 한계"입니다. Microsoft goo와 호환되는 것은 없습니다.
Lundin

2
C99는 int32_t, int16_t 등을 표준에 추가합니다. Microsoft의 추가 기능과 100 % 호환되지는 않지만 유사한 방식으로 작동합니다.
Monica에 관한 질문

1

실제로 이해하는 것은 간단합니다 .Google 계산기로 계산할 수도 있습니다. int에 32 비트가 있고 컴퓨터는 이진이므로 비트 당 2 개의 값 (스팟)을 가질 수 있습니다. 2 ^ 32를 계산하면 4,294,967,296이됩니다. 따라서이 숫자를 2로 나누면 (그중 반은 음의 정수이고 다른 반은 양이기 때문에) 2,147,483,648을 얻습니다. 그리고이 숫자는 32 비트로 표현할 수있는 가장 큰 정수입니다.주의를 기울이면 2,147,483,648이 1,2,147,483,647보다 2,147,483,647보다 큽니다.이 숫자 중 하나가 0을 나타 내기 때문에 불행히도 2 ^ 32는 홀수가 아니므로 중간에 하나의 숫자 만 가지지 않으므로 양의 정수에는 암호가 하나 덜 있고 음수는 2,147,483,648의 절반을 얻습니다.

그리고 그게 다야. 언어가 아닌 기계에 따라 다릅니다.


2
이것은 그가 요구 한 것이 아닙니다 ... 질문은 "C int가 Java int와 다른 이유는 무엇입니까?"입니다.
ElectronWill

그리고 Java에서 크기 는 기계에 의존 int 하지 않습니다 . int== 32 비트 부호, 2의 보수는 Java 언어 사양에 의해 정의되며 양극 처리 된 unobtainium 시트에 새겨 져 있습니다. (좋아요, 마지막 비트는 아닐 수도 있습니다.)
Stephen C

-1

표준 C에서는 INT_MAX를 최대 'int'값으로 사용할 수 있습니다.이 상수는 "limits.h"에 정의되어야합니다. 언급 된 바와 같이 다른 상수들 ( http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html ) 에도 비슷한 상수들이 정의되어 있습니다 .이 상수들은 구현에 따라 다르지만 최소 비트에 따라 최소값을가집니다 표준에 지정된대로 각 유형에 대해


5
이것은 실제로 OP의 질문을 해결하는 데 도움이되지 않습니다. 또한 답변의 핵심 부분을 다른 사이트에 묻어서는 안됩니다.
Brad Koch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.