C의 크기가 "int"2 바이트 또는 4 바이트입니까?


168

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

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



1
int여러 정수 유형 중 하나입니다 . "정수"의 크기에 대해 물었습니다. 당신은 아마의 크기에 대해 물어볼 것입니다 int.
키이스 톰슨

3
더 나은 교과서를 찾아야합니다. a int가 2 바이트 라고하는 교과서는 (a) 아마도 오래된 시스템을 가리킬 것입니다. C에 관한 최고의 책은 Kernighan과 Ritchie의 "The C Programming Language"입니다. comp.lang.c FAQ 의 질문 18.10도 참조하십시오 .
키이스 톰슨

2
#define int int64_t64 비트 플랫폼에서도 시도하십시오 . 그냥 사용하십시오 sizeof. ;-)
넷 코더

답변:


183

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

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

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


31
@RajivPrathap : 글쎄, 컴파일러에 따라 다르지만 컴파일러는 머신에 따라 달라지는 지 결정합니다. :)
541686

2
전 처리기의 크기가 필요한 경우 INT_MAX와 같은 사전 정의 된 매크로를 확인할 수 있습니다. 값이 코드에서 예상 한 값이 아닌 경우 int의 바이트 크기는 현재 컴파일러 / 플랫폼 조합에서 다릅니다.
Walt Sellers

3
머신에 의존 할뿐만 아니라 머신에서 실행되는 운영 체제에 따라 다릅니다. 예를 들어 Win64에서는 long이 4 바이트 인 반면 Linux64에서는 long은 8 바이트입니다.
Cem Kalyoncu

9
잘못된. 대부분의 64 비트 시스템에서 int는 여전히 4 바이트입니다. en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models
phuclv

7
sizeof(int)의 값이 될 수 있습니다 1. 바이트는 8 비트 일 필요는 없으며 일부 기계에는 8 비트 주소 지정 가능 단위가 없습니다 (기본적으로 표준에서 바이트 의 정의 임). 추가 정보가 없으면 답변이 정확하지 않습니다.
이 사이트에 대해 너무 정직합니다.

102

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

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

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


7
@ nevanking : 두 개의 보완 시스템 (내가 아는 모든 기계)에서 그렇습니다. 그러나 C는 그것이 사실임을 보증하지 않습니다.
FatalError

@nevanking 나는 C를 처음 접했지만 32767이 아닌가? 다른 비트를 사용할 것이기 때문에 32767이 아닌가? 3 자리 (0 또는 1)를 보유 할 수 있으므로 000에서 111 (10 진수 7)로 갈 수 있다고 상상해보십시오. 7은 2의 지수 바로 앞에 있습니다. 8 (1000)까지 갈 수 있다면, 그 4 자리 숫자를 15까지 사용할 수 있습니다! 32767과 같은 것은 2의 지수 바로 직전에 사용 가능한 모든 비트를 소진합니다.
RGS

3
@RSerrao 나도 C 전문가는 아니지만 양수에 대한 AFAIK는 최대 음수보다 하나 적습니다. 따라서 -8에서 7, -256에서 255 등입니다. 음수는 0을 세지 않아도됩니다.
nevan king

1
"16 비트.이 경우 int는 2 바이트입니다"는 잘못 될 수 있습니다. CHAR_BIT가 16이면 sizeof (int)는 1 바이트 (또는 char) 일 수 있습니다.
12431234123412341234123

6
@nevanking : signed에 대해 2의 보수 표현을 가정 한 경우에만 int. C는 그런 가정을하지 않습니다. 1의 보수 및 부호 크기 시스템은 -3276816 비트로 표현할 수 없습니다 . 오히려, 그들은 0에 대한 두 가지 표현을 가지고 있습니다 (긍정적 및 부정적). 그렇기 때문에의 최소 범위는 int입니다 [-32767..32767].
John Bode

33

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

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

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


2
The idea behind int was that it was supposed to match the natural "word" size on the given platform-내가 찾던 것입니다. 이유가 무엇인지 알 수 있습니까? 자유 세계에서 int는 메모리에서 연속 바이트 수를 차지할 수 있습니다. 8, 16 뭐든지
bholagabbar

19

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

 [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

3
누군가 귀하의 게시물을 수정하여 범위를 "수정"했지만 귀하의 수정 사항이 귀하의 의도를 적절하게 반영하는지 확실하지 않습니다. 그것은 2의 보수 구현을 가정하며, 대부분의 경우에 해당하지만 전부는 아닙니다. 귀하의 답변은 구현 의존성을 구체적으로 지적하기 때문에 편집이 잘못되었을 수 있습니다. 동의하면 수정 사항을 되 돌리십시오.
코디 그레이

1
@ k06a 편집 내용이 잘못되었습니다 . 원래 범위를 2 보수 범위로 구체적으로 변경했습니다 . 이는 C 표준에 지정된 범위가 아닙니다 .
Antti Haapala

@CodyGray 이것은 지난 3 년간 1의 보수를 준수했으며 OP는 아무 말도하지 않고 앞뒤로 변동 해 왔으며 "신뢰할 수 있다고 가정 할 수있다"고 말하면서 "수정 범위"로 2의 보수로 변경 한 편집을 되돌 렸습니다. 아직 정확한 것은 아닙니다.
Antti Haapala

13

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 바이트 정수 의 일반적인 오해는 이러한 세부 사항을 무시합니다).


13

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보다 순위가 높습니다.

8

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

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


6

C의 크기가 "int"2 바이트 또는 4 바이트입니까?

대답은 "예"/ "아니오"/ "아마도"/ "아마도"입니다.

가장 작은 단위로 공지 : C 프로그래밍 언어는 다음의 지정 char도 불리는 "바이트" , 정확하게 CHAR_BIT넓은 여기서 비트CHAR_BIT 최소 8입니다.

그래서, 한 바이트 C에서이 반드시 아니다 진수 , 8 비트, 즉. 과거에 C 코드 (및 Unix)를 실행하는 최초의 플랫폼 중 하나에는 4 바이트가 int있었지만 총 int36 비트가있었습니다 CHAR_BIT.

int플랫폼의 범위는 최소한-32767 ... 32767 자연 정수 크기 여야합니다 . int를 사용하여 플랫폼 바이트 의 크기를 얻을 수 있습니다 sizeof(int). 이 값을 곱하면 CHAR_BIT비트의 너비를 알 수 있습니다.


36 비트 시스템은 대부분 죽었지 만 8 비트가 아닌 바이트를 가진 플랫폼이 여전히 있습니다. 어제 16 비트 바이트의 Texas Instruments MCU에 대한 질문 이있었습니다 . 의 C99 호환 C11 컴파일러 .

TMS320C28x 는 그 것 char, short그리고 int있는 모든 따라서 하나의 바이트의 16 비트 폭, 및. long int2 바이트이고 long long int4 바이트입니다. C의 장점은 이와 같은 플랫폼을위한 효율적인 프로그램을 작성할 수 있으며 심지어 휴대용 방식으로 수행 할 수 있다는 것입니다!


"CHAR_BIT이 (가) 9이기 때문에!" -당시에는 362880 비트 컴퓨팅이있었습니다!? 감동적인.
Josh Desmond

5

대부분 사용하는 플랫폼에 따라 다릅니다. 컴파일러에 따라 다릅니다. 대부분의 컴파일러에서 int4 바이트 입니다. 컴파일러에서 사용중인 것을 확인하려면을 사용할 수 있습니다 sizeof(int).

main()
{
    printf("%d",sizeof(int));
    printf("%d",sizeof(short));
    printf("%d",sizeof(long));
}

c 컴파일러가 약속하는 유일한 것은 short의 크기가 int보다 작거나 같아야하고 long의 크기는 int보다 크거나 같아야한다는 것입니다. 따라서 int의 크기가 4이면 short의 크기는 2 또는 4이지만 더 크지 않을 수 있습니다 long과 int에 대해서도 동일합니다. 또한 짧고 긴 크기는 같을 수 없다고 말합니다.


1
매개 변수에 사용 %d하는 size_t것은 UB입니다.
Paul R

3

이는 구현에 따라 다르지만 일반적으로 x86 및 ARM과 같은 널리 사용되는 아키텍처에는 int4 바이트가 걸립니다. sizeof(int)또는 컴파일 하려는 다른 유형을 사용하여 컴파일 타임에 언제든지 확인할 수 있습니다 .

특정 크기의 유형을 사용하려면 다음 유형을 사용하십시오. <stdint.h>


2
#include <stdio.h>

int main(void) {
    printf("size of int: %d", (int)sizeof(int));
    return 0;
}

이것은 4를 반환하지만 아마도 컴퓨터에 따라 다를 수 있습니다.


1

C의 크기가 "int"2 바이트 또는 4 바이트입니까?

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

C는 "바이트"가 "바이트"당 8 비트가 아닌 다른 것을 허용합니다.

CHAR_BIT 비트 필드 (바이트)가 아닌 가장 작은 객체의 비트 수 C11dr §5.2.4.2.1 1

8보다 큰 값은 점점 흔하지 않습니다. 최대 이식성을 위해 CHAR_BIT8 대신 에 사용하십시오 . C int에서 비트 단위 의 크기 는 sizeof(int) * CHAR_BIT입니다.

#include <limits.h>
printf("(int) Bit size %zu\n", sizeof(int) * CHAR_BIT);

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

int비트 크기는 일반적으로 32 또는 16 비트이다. C 지정 최소 범위 :

int INT_MIN-32767 유형의 객체에 대한 최소값 +32767
유형의 객체에 대한 최대 값 C11dr §5.2.4.2.1 1int INT_MAX

최소 범위 에 대한 int힘 비트 크기는합니다프로세서가 "8 비트"인 경우에도 최소 16 . 64 비트와 같은 크기는 특수 프로세서에서 볼 수 있습니다. 18, 24, 36 등과 같은 다른 값은 역사적인 플랫폼에서 발생했거나 이론적으로는 가능합니다. 현대식 코딩은 2의 거듭 제곱에 대해 거의 걱정하지 않습니다.int 비트 크기에 .

컴퓨터의 프로세서 및 아키텍처는 int 비트 크기를 결정합니다.

그러나 64 비트 프로세서의 경우에도 int큰 코드 기반 int이 32 비트 (또는 32/16) 에 의존하기 때문에 호환성 때문에 컴파일러의 크기는 32 비트 일 수 있습니다 .


-1

이 질문에 대한 답을 얻을 수있는 좋은 자료입니다.

그러나이 질문은 항상 "예. 둘 다"라는 정답입니다.

아키텍처에 따라 다릅니다. 16 비트 컴퓨터 이하에서 작업하려는 경우 4 바이트 (= 32 비트) 일 수 없습니다. 32 비트 이상의 머신에서 작업중인 경우 길이는 32 비트입니다.

알아 내기 위해 프로그램이 읽을 수있는 것을 출력 할 준비를하고 "sizeof"기능을 사용하십시오. 선언 된 데이터 유형의 크기를 바이트 단위로 반환합니다. 그러나 이것을 배열과 함께 사용하여 carfull하십시오.

선언 int t[12];하면 12 * 4 바이트를 반환합니다. 이 배열의 길이를 얻으려면을 사용하십시오 sizeof(t)/sizeof(t[0]). send 배열의 크기를 계산 해야하는 함수를 작성하려는 경우 다음을 기억하십시오.

typedef int array[12];
int function(array t){
    int size_of_t = sizeof(t)/sizeof(t[0]);
    return size_of_t;
}
void main(){
    array t = {1,1,1};  //remember: t= [1,1,1,0,...,0]
    int a = function(t);    //remember: sending t is just a pointer and equal to int* t
   print(a);   // output will be 1, since t will be interpreted as an int itselve. 
}

따라서 이것은 다른 것을 반환하지 않습니다. 배열을 정의하고 나중에 길이를 얻으려면 sizeof를 사용하십시오. 함수에 배열을 보낼 경우, 전송 값은 첫 번째 요소의 포인터 일뿐입니다. 그러나 하나의 경우 배열의 크기를 항상 알고 있습니다. 사례 2는 두 가지 기능을 정의하여 파악할 수 있으며 일부 성능을 놓칠 수 있습니다. 함수 (배열 t)를 정의하고 함수 2 (배열 t, int size_of_t)를 정의하십시오. "function (t)"를 호출하여 일부 복사 작업으로 길이를 측정하고 그 결과를 function2로 보내면 가변 배열 크기에서 원하는 것을 수행 할 수 있습니다.


항상 진실하지 않은 것을 가정하므로 제공하는 링크는 정보의 나쁜 소스 (예 : char항상 signed)
안드레이 데미안-Fekete
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.