[c] C의 크기가 “int”2 바이트 또는 4 바이트입니까?

C의 정수 변수가 2 바이트 또는 4 바이트를 차지합니까? 그것이 의존하는 요인은 무엇입니까?

대부분의 교과서에서는 정수 변수가 2 바이트를 차지한다고 말합니다. 그러나 정수 배열의 연속 주소를 인쇄하는 프로그램을 실행하면 4의 차이가 표시됩니다.



답변

나는 그것과 같다는 것을 안다 sizeof(int). 의 크기 int는 실제로 컴파일러에 따라 다릅니다. 당시에는 프로세서가 16 비트 일 때 int2 바이트였습니다. 요즘에는 32 비트 및 64 비트 시스템에서 가장 자주 4 바이트입니다.

그럼에도 불구 sizeof(int)하고 프로그램이 실행되는 특정 시스템의 정수 크기를 얻는 가장 좋은 방법은 사용 입니다.

편집 :int 대부분의 64 비트 시스템에서 8 바이트의 잘못된 문장을 수정했습니다 . 예를 들어 64 비트 GCC에서 4 바이트입니다.


답변

이것은 처음에는 혼동 될 수있는 C의 요점 중 하나이지만 C 표준 은 지원되는 정수 유형 의 최소 범위 만 지정합니다 . int-32767 ~ 32767을 보유 할 수 있으며 16 비트가 필요합니다. 이 경우, int는 2 바이트입니다. 그러나 많은 현대 컴파일러가 볼 수 있듯이 구현은 최소값을 초과하지 않습니다.int 32 비트를 (이것은 4 바이트를 매우 보편적으로 사용함).

책이 2 바이트라고 말하는 이유는 아마도 오래 되었기 때문일 것입니다. 한때는 이것이 표준이었습니다. 일반적으로 항상sizeof 중인 플랫폼에 몇 바이트가 있는지 알아 내려면 연산자를 .

이를 해결하기 위해 C99는 특정 크기의 정수 (예 : int16_t또는)를 명시 적으로 요청할 수있는 새로운 유형을 추가했습니다 int32_t. 그 전에는 특정 너비의 정수를 얻는 보편적 인 방법이 없었습니다 (대부분의 플랫폼은 플랫폼별로 유사한 유형을 제공했지만).


답변

구체적인 답변이 없습니다. 플랫폼에 따라 다릅니다. 구현 정의입니다. 2, 4 또는 다른 것일 수 있습니다.

아이디어 int는 주어진 플랫폼에서 16 비트 플랫폼의 16 비트, 32 비트 플랫폼의 32 비트, 64 비트 플랫폼의 64 비트와 같은 “단어”크기와 일치해야한다는 것입니다. 그러나 이전 버전과의 호환성을 위해 일부 컴파일러는 32 비트를 선호합니다.int 64 비트 플랫폼에서도 합니다.

int16 비트 워드 크기의 일부 임베디드 플랫폼을 사용하지 않으면 2 바이트의 시간 이 오래 걸렸습니다 (16 비트 플랫폼?). 당신의 교과서는 아마 아주 오래된 것입니다.


답변

이 질문에 대한 답변은 사용중인 플랫폼에 따라 다릅니다.
그러나 플랫폼에 관계없이 다음 유형을 안정적으로 가정 할 수 있습니다.

 [8-bit] signed char: -127 to 127
 [8-bit] unsigned char: 0 to 255
 [16-bit]signed short: -32767 to 32767
 [16-bit]unsigned short: 0 to 65535
 [32-bit]signed long: -2147483647 to 2147483647
 [32-bit]unsigned long: 0 to 4294967295
 [64-bit]signed long long: -9223372036854775807 to 9223372036854775807
 [64-bit]unsigned long long: 0 to 18446744073709551615


답변

C의 정수 변수가 2 바이트 또는 4 바이트를 차지합니까?

사용중인 플랫폼과 컴파일러 구성 방법에 따라 다릅니다. 신뢰할 수있는 유일한 대답은 sizeof연산자 를 사용 하여 특정 상황에서 정수의 크기를 확인하는 것입니다.


그것이 의존하는 요인은 무엇입니까?

size가 아니라 range 가 가장 잘 고려 될 수 있습니다 . 두 가지 모두 실제로 다를 수 있지만 우리가 볼 수 있듯이 크기보다 범위에 따라 변수 유형을 선택하는 것이 훨씬 더 멍청합니다. 또한 표준은 크기가 아닌 범위를 기준으로 정수 유형을 선택하는 것을 고려하도록 권장 하지만, 지금 은 표준 사례를 무시 하고 호기심 , 바이트 및 정수 표현을 탐구 합시다. 토끼 구멍과 자신을 위해 그것을보고 …sizeofCHAR_BIT


sizeof, 바이트 및 CHAR_BIT

C 표준 (위에 링크 됨)에서 가져온 다음 진술은 이것을 개선 할 수 없다고 생각하는 단어로 설명합니다.

sizeof연산자 식 또는 유형의 괄호 이름 일 수있다 피연산자의 크기 (바이트)를 산출한다. 크기는 피연산자의 유형에 따라 결정됩니다.

명확한 이해가 있다면 바이트 에 대한 논의로 이어질 것 입니다. 실제로 바이트에 몇 비트가 있는지 알려 주면 바이트 는 8 비트 라고 가정합니다 . 그것은 일반적인 2 바이트 (또는 4 바이트) 정수에 대해 이야기 할 때 고려되지 않는 뉘앙스 중 또 하나입니다.CHAR_BIT .

지금까지 내용을 마무리하겠습니다.

  • sizeof => 크기 (바이트)
  • CHAR_BIT => 바이트 단위의 비트 수

따라서, 시스템에 따라 sizeof (unsigned int)있을 수 있는 것보다 값이 큰 영 (단지 2 또는 4)의 경우로서 CHAR_BIT16 다음 단일 (여섯 비트) 바이트 열 여섯 비트 정수가 설명 표현에 충분한 비트가 표준 (아래 인용). 반드시 유용한 정보는 아닙니다. 그렇지 않습니까? 더 깊이 탐구합시다 …


정수 표현

C 표준은 여기 에 모든 표준 정수 유형 (및 CHAR_BITfwiw) 의 최소 ​​정밀도 / 범위를 지정합니다 . 이것으로부터 우리는 을 저장하기 위해 필요한 비트 수에 대한 최소값 을 도출 할 수 있지만 범위에 따라 변수를 선택할 수도 있습니다 . 그럼에도 불구하고이 답변에 필요한 세부 사항 중 상당 부분이 여기에 있습니다. 예를 들어, 표준에 따르면 16 비트 이상의 스토리지가 필요합니다.unsigned int

UINT_MAX                                65535 // 2¹⁶ - 1

따라서 우리는 unsigned int2 바이트 를 얻는 곳 ( 최소한 ) 16 비트 필요 하다는 것을 알 수 있습니다 ( CHAR_BIT8이 가정 ) … 그리고 그 한계가로 증가하면 2³² - 1사람들은 대신 4 바이트를 진술하고있었습니다. 이것은 당신이 관찰 한 현상을 설명합니다 :

대부분의 교과서에서는 정수 변수가 2 바이트를 차지한다고 말합니다. 그러나 정수 배열의 연속 주소를 인쇄하는 프로그램을 실행하면 4의 차이가 표시됩니다.

당신은 이식이 불가능한 C를 가르치는 고대 교과서와 컴파일러를 사용하고 있습니다. 당신의 교과서를 쓴 저자는 알지 못할 수도 있습니다 CHAR_BIT. 당신은 해야한다 교과서 (컴파일러)를 업그레이드하고, IT는 끊임없이 진화하는 필드는 유지해야한다는 것을 기억하기 위해 노력하고 앞으로의 경쟁 …하지만 그것에 대해 충분히에; 기본 정수 바이트가 저장 하는 다른 이식 불가능한 비밀이 무엇인지 보자 …

가치 비트 는 일반적인 오해가 계산하는 것으로 보입니다. 위의 예는 unsigned일반적으로 값 비트 만 포함 하는 정수 유형을 사용 하므로 악마를 자세하게 놓치기 쉽습니다.

부호 비트 … 위의 예 에서는 주석 에서 값을 추출하는 것이 간단한 예이므로 UINT_MAX상한으로 인용 했습니다 . 부호있는 유형의 경우 양수 값과 음수 값 (기호)을 구별하려면 부호 비트도 포함해야합니다.unsigned int16

INT_MIN                                -32768 // -(2¹⁵)
INT_MAX                                +32767 // 2¹⁵ - 1

패딩 비트 … 패딩 비트가 정수인 컴퓨터는 흔하지 않지만 C 표준을 사용하면 가능합니다. 일부 기계 (예 : 기계 )는 두 개의 작은 (부호있는) 정수 값을 함께 결합하여 더 큰 정수 유형을 구현합니다 … 부호있는 정수를 결합하면 낭비되는 부호 비트가 생깁니다. 즉 낭비되는 비트를 고려 패딩 포함될 수 패딩 비트 C. 다른 실시 예에서는 패리티 비트 및 트랩 비트 .


당신이 볼 수 있듯이, 표준과 같은 범위를 고려하고 장려하는 것 같다 INT_MIN.. INT_MAX기타 최소 / 표준에서 최대 값을 정수 타입을 선택하고, 스타일을 장려 가능성 등을 잊어서는 다른 미묘한 요인이 있기 때문에 크기에 의존 CHAR_BIT하고 패딩 비트가있는 의 가치에 영향을 줄 수 있습니다 sizeof (int)(즉, 2 바이트 및 4 바이트 정수 의 일반적인 오해는 이러한 세부 사항을 무시합니다).


답변

C99 N1256 표준 초안

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

크기 int및 기타 모든 정수 유형은 구현 정의이며 C99는 다음을 지정합니다.

  • 최소 크기 보장
  • 유형 간 상대 크기

5.2.4.2.1 “정수 유형의 크기 <limits.h>“는 최소 크기를 제공합니다.

1 […] 구현 정의 된 값의 크기는 […]

  • UCHAR_MAX 255 // 2 8 − 1
  • USHRT_MAX 65535 // 2 16 − 1
  • UINT_MAX 65535 // 2 16 − 1
  • ULONG_MAX 4294967295 // 2 32 − 1
  • ULLONG_MAX 18446744073709551615 // 2 64 − 1

6.2.5 “유형”은 다음과 같이 말합니다.

8 부호가 같고 정수 변환 순위가 다른 두 정수 유형 (6.3.1.1 참조)의 경우 정수 변환 순위가 작은 유형의 값 범위는 다른 유형의 값의 하위 범위입니다.

6.3.1.1 “부울, 문자 및 정수”는 상대 변환 순위를 결정합니다.

1 모든 정수 유형에는 다음과 같이 정의 된 정수 변환 순위가 있습니다.

  • long long int의 순위는 long int의 순위보다 커야하며, int의 순위보다 커야합니다. int의 순위는 서명 된 char의 순위보다 커야합니다.
  • 부호없는 정수 유형의 순위는 해당하는 부호있는 정수 유형의 순위와 같습니다 (있는 경우).
  • 모든 정수 유형 T1, T2 및 T3의 경우 T1이 T2보다 순위가 높고 T2가 T3보다 순위가 높으면 T1이 T3보다 순위가 높습니다.

답변

유일한 것을 보장이 char있어야 적어도 폭 8 비트 shortint있어야 적어도 16 비트 폭하고 long있어야 적어도 넓은 32 비트, 그리고 sizeof (char)<= sizeof (short)<= sizeof (int)<=sizeof (long) (같은 이러한 유형의 서명 버전 사실 ).

int 플랫폼에 따라 16 비트에서 64 비트 사이 일 수 있습니다.