int, Int16, Int32 및 Int64의 차이점은 무엇입니까?


229

사이의 차이 무엇입니까 int, System.Int16, System.Int32그리고 System.Int64그 크기 이외는?

답변:


348

각 정수 유형은 저장 용량의 범위가 다릅니다

   Type      Capacity

   Int16 -- (-32,768 to +32,767)

   Int32 -- (-2,147,483,648 to +2,147,483,647)

   Int64 -- (-9,223,372,036,854,775,808 to +9,223,372,036,854,775,807)

제임스 서덜랜드 (James Sutherland)가 그의 답변 에서 언급 한 바와 같이 :

int그리고 Int32실제로 동의어이다; int좀 더 친숙하게 보일 것 Int32입니다. 코드를 읽는 사람들에게는 32 비트가 더 명확 해집니다. Int32크기가 중요한 (암호화 코드, 구조) 'integer'가 필요한 곳에 int를 사용하는 경향이 있습니다. 따라서 미래의 관리자는 int적절한 경우 확대하는 것이 안전하다는 것을 알 수 있지만 Int32변수를 동일한 방식으로 변경해야합니다. .

결과 코드는 동일합니다. 차이점은 순전히 가독성 또는 코드 모양 중 하나입니다.


1
값이 65,535 (부호) 또는 -32,768에서 32,767 (부호)을 초과하지 않는다는 것을 알고 있다면 int16단순히 메모리 자원을 절약하는 것과 달리 정수를 정의하는 것이 좋지 않습니다 int.
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

8
int와 int32는 동의어 일 수 있지만 반드시 그럴 필요는 없습니다. 현재 판매되는 대부분의 시스템은 64 비트이며 int는 64 비트입니다.
Martijn Otto

4
Matthew T. Baker 및 성능 관점에서 사용할 것을 결정하려고 여기에 온 나와 같은 다른 사람들을 위해 Integer가 Int16보다 더 효율적임을 제안하는이 게시물을 확인해야합니다 : stackoverflow.com/questions/129023/ net-integer-vs-int16
Tony L.

19
@MartijnOtto이 질문에는 C # 태그가 있습니다. C #에서 int입니다 항상 Int32 관계없이 시스템. 아마도 당신은 C ++을 생각하고 있습니까?

9
@MattBaker : 일반적으로 최신 컴퓨터에서 int16은 int32 (및 실제로는 int64)만큼 많은 공간을 차지하므로 대부분의 작업이 효율적으로 수행되기 위해 데이터를 패딩하여 액세스를 32 또는 64 비트 경계에 맞 춥니 다 (각각 32 또는 64 비트 모드에서). 일부 아키텍처에서는 정렬되지 않은 액세스가 엄청나게 비효율적이며 다른 아키텍처에서는 불가능하기 때문입니다.
Joel

118

여기서 유일한 차이점은 크기입니다. 여기에있는 모든 int 유형은 다양한 크기의 부호있는 정수 값입니다.

  • Int16: 2 바이트
  • Int32int: 4 바이트
  • Int64 : 8 바이트

Int64나머지와는 약간의 차이가 있습니다. Int64저장 위치에 대한 32 비트 플랫폼 할당 은 원 자성으로 보장되지 않습니다. 다른 모든 유형에 대해 보장됩니다.


내가 사용하는 경우 Int6432 bit Windows Operating System나는이 직면 할 수있는 문제는 무엇인가? 예가 있습니까?
shaijut

70

int

C #에 정의 된 기본 데이터 유형입니다.

FCL 타입의 Int32에 매핑됩니다.

값 형식이며 System.Int32 구조체를 나타냅니다.

부호가 있으며 32 비트가 필요합니다.

최소 -2147483648과 최대 +2147483647 값을 갖습니다.

Int16

FCL 타입입니다.

C #에서 short 는 Int16에 매핑됩니다.

값 형식이며 System.Int16 구조체를 나타냅니다.

부호가 있으며 16 비트가 필요합니다.

최소 -32768 및 최대 +32767 값을 갖습니다.

Int32

FCL 타입입니다.

C #에서 int 는 Int32에 매핑됩니다.

값 형식이며 System.Int32 구조체를 나타냅니다.

부호가 있으며 32 비트가 필요합니다.

최소 -2147483648과 최대 +2147483647 값을 갖습니다.

Int64

FCL 타입입니다.

C #에서 long 은 Int64에 매핑됩니다.

값 형식이며 System.Int64 구조체를 나타냅니다.

부호가 있으며 64 비트가 필요합니다.

최소 –9,223,372,036,854,775,808 및 최대 9,223,372,036,854,775,807 값을 갖습니다.


그냥 그 추가 Int64데이터 형식을 사용하여 표시 할 수 있습니다 L또는 l접미사 동안 Int16또는 Int32C #으로 접하지 않았습니다.
RBT

14

Jeffrey Richter (.NET Framework 개발 기여자 중 하나)의 책 'CLR via C #'에 따르면 :

int는 C # 컴파일러에서 허용하는 기본 형식 인 반면 Int32는 CLS를 따르는 언어에서 사용할 수있는 프레임 워크 클래스 라이브러리 형식입니다. 실제로 int는 컴파일 중에 Int32로 변환됩니다.

또한,

C #에서는 long이 System.Int64에 매핑되지만 다른 프로그래밍 언어에서는 long이 Int16 또는 Int32에 매핑 될 수 있습니다. 실제로 C ++ / CLI는 Int32만큼 오랫동안 처리합니다.

실제로 대부분의 (.NET) 언어는 키워드로 취급하지 않으며 키워드를 사용하는 코드를 컴파일하지 않습니다.

필자는이 저자와 .NET에 대한 많은 표준 문헌에서 주로 이러한 상호 운용성 문제에 대해 FCL 유형 (예 : Int32)을 언어 별 기본 유형 (예 : int)보다 선호합니다.


8

아무것도. 유형 간의 유일한 차이 이다 (따라서, 그들은 나타낼 수있는 값의 범위) 크기.


8

16, 32 및 64 유형에 대한 매우 중요한 참고 사항 :

이 쿼리를 실행하면 ... Array.IndexOf (new Int16 [] {1,2,3}, 1)

당신이 묻고 있기 때문에 0 (0)을 얻는다고 가정합니다. .

내가 찾은 것을 확인하십시오. 다음은 모두 -1이 아니라 0을 제공해야합니다 (모든 프레임 워크 버전 2.0, 3.0, 3.5, 4.0에서 이것을 테스트했습니다)

씨#:

Array.IndexOf(new Int16[]{1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32[]{1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64[]{1,2,3}, 1) = 0 (correct)

VB.NET :

Array.IndexOf(new Int16(){1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32(){1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64(){1,2,3}, 1) = -1 (not correct)

내 요점은 Array.IndexOf 비교의 경우 Int32 만 신뢰한다는 것입니다!


7
첫 번째 예제가 그 방식으로 작동하는 이유를 명확히하기 위해 첫 번째 리터럴 1, 2 및 3은 암시 적으로 short배열에 맞게 캐스팅되고 두 번째 리터럴 1은 일반으로 남겨집니다 int. ,, 와 (int)1같은 것으로 간주되지 않으므로 결과는 -1입니다. (short)1(short)2(short)3

4
C # 버전에서도 비슷한 조정이 가능하지만 간단한 형식 지정자가이 문제를 해결합니다. Array.IndexOf(new Int16(){1,2,3}, 1S) Array.IndexOf(new Int32(){1,2,3}, 1I) Array.IndexOf(new Int64(){1,2,3}, 1L)모든 것이 예상대로 작동합니다.
Mark Hurd

1
작동하지 않는 것은 Object[],Object과부하를 사용했습니다 . C #은 암시 적으로 제기되는 intA를 long필요로 할 때 (그리고 또한 제기 shortint또는 long)하지만, 암시 적으로 사용하여, 낙담하지 object않고 과부하. With Option Strict On또는 OffVB는 균일 한 유형이 제공 될 때 유형이 지정된 과부하 만 사용하고, 그렇지 않으면 object과부하를 사용합니다 .
Mark Hurd

당신의 대답은 오도의 소지가 있습니다. 코드는 다른 유형의 값을 비교하고 있습니다. 결론 for Array.IndexOf comparisons, only trust Int32!이 잘못되었습니다. 최종 1인수를 해당 배열 유형으로 캐스트하면 예상대로 작동합니다.
돈 Cheadle

이것은 매우 흥미롭고 예기치 않은 행동입니다 (긴 작품에는 있지만 int에는 짧지 않기 때문에) upvote입니다!
sth_Weird

7

편집 : 이것은 C #,이 질문에 대답했을 때 놓친 태그에 대해서는 사실이 아닙니다. 더 많은 C # 답변이있는 경우 대신 투표하십시오!


그것들은 모두 다양한 크기의 정수를 나타냅니다.

그러나 매우 작은 차이가 있습니다.

int16, int32 및 int64는 모두 고정 크기입니다.

int의 크기는 컴파일하는 아키텍처에 따라 다릅니다 .C 사양은 int를 short로만 정의합니다. 실제로 대상 프로세서의 너비 이지만 32 비트이지만 아마도 알아야합니다. 그렇지 않을 수도 있습니다.


1
이것이 실제로 맞는 유일한 답변이므로 이것이 정답입니다
mjs

2
아니요, C #에는 해당되지 않습니다. AC # int의 크기는 항상 32 비트입니다. C의 경우 예,이 합병증을 처리해야하고 가변 int 크기를 처리하기 위해 종종 C 코드에서 매크로를 볼 수 있습니다. ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf 18 페이지를 참조 하십시오 .
Ananke

@Ananke Ahh, C # 태그가 누락되었습니다. 답변에 대한 투표를 되돌릴 수 있기를 바랍니다 .....
mjs

6
  1. intint32하나의 동일한 (32 비트 정수)이다
  2. int16 short int (2 바이트 또는 16 비트)
  3. int64 긴 데이터 유형 (8 바이트 또는 64 비트)

2
int는 32 비트임을 보증하지 않습니다.
mjs

8
@mjs, 이것은 사실이 아닙니다. C #에서 int별칭 Int32은 항상 32 비트임을 보증합니다.
David Arno

실제로 mjs가 말한 것은 정확합니다 .INT는 시스템 x86 또는 x64를 기반으로 한 정수를 의미하므로 시스템이 x64이면 int는 Int64이므로 32는 보장되지 않습니다. int32를 x64에 넣으면 항상 int32가됩니다. .
Yogurtu

5
아닙니다. David Arno의 말이 맞습니다. C # 언어는 구체적으로 'int'를 정의하여 32 비트 정수 (Int32)를 의미합니다. 다른 언어 (C / C ++ 등)에서는이를 지정할 수 없지만이 질문에는 'C #'태그가 붙어 있습니다.
Theo Brinkman

@TheoBrinkman 맞습니다. 다음은 C #의 정수 형식에 대한 Microsoft 페이지입니다. docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Max Barraclough

5

둘 다 실제로 동의어입니다. 그러나 나는 그들 사이의 작은 차이점을 발견했습니다.

1) Int32만드는 동안 사용할 수 없습니다enum

enum Test : Int32
{ XXX = 1   // gives you compilation error
}

enum Test : int
{ XXX = 1   // Works fine
}

2) Int32시스템 선언에 따릅니다. 제거 using.System하면 컴파일 오류가 발생하지만int


-8

Int = Int32-> 원래 긴 유형

Int16-> 원래 int

Int64-> 64 비트 시스템 이후에 새로운 데이터 유형을 사용할 수있게됩니다

"int"는 이전 버전과의 호환성을 위해서만 사용할 수 있습니다. 우리는 프로그램을보다 정확하게 만들기 위해 새로운 int 타입을 사용해야합니다.

---------------

IntInt16, Int32 및 Int64와 비슷한 이름의 클래스가 없다는 점에서 한 가지 더 알았습니다 . TryParse정수 와 같은 유용한 기능은 모두에서 제공됩니다 Int32.TryParse.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.