C에서 짧고 int이며 오래 발명 된 이유는 무엇입니까?


16

인식하지 못했습니다 정확한을 만드는 목적으로 무엇인가 short, int그리고 longC의 데이터 유형은?

나는 그 크기가 묶여있는 것처럼, 그것은하지 않는 것입니다 물어 이유 - 그들은 어떤 크기의 수는 너무 오래 같은 short보다 작은 int예를 들어,.

있는 상황은, 다음, 당신은을 사용한다 unsigned int또는 unsigned long대신에, 예를 들어, size_t바이너리 호환성을 제공하므로 희망을 수행하지 않을 때?

(크기를 모른다면 언제 선택할 것인지 어떻게 알 수 있습니까?)


2
체크 아웃<stdint.h>
BlackJack

1
@BlackJack : Haha 네, 실제로 있습니다.하지만 제 질문은 왜 모든 타입이 기본적으로 정의되어 있지 않습니까? "후시는 20/20입니다"문제입니까, 아니면 특별한 이유가 있습니까?
user541686

2
C는 이식 가능하고 기본 하드웨어에 가깝습니다. 바이트 길이가 8 비트가 아닌 플랫폼이 있었지만 여전히 C를 사용할 수 있습니다. 고정 된 데이터 유형 세트는 충분하지 않으며 고정 크기 정수도 휴대 할 수 없습니다.
SK-logic

@ SK-logic : 그들이 말 sizeof(short) == 2 * sizeof(char)했거나 비슷하지 않습니까?
user541686

1
에 플랫폼이 있으며 sizeof(char) == sizeof(short)의미가 있습니다. 불행히도, 모든 가능한 플랫폼과 기존 플랫폼에 맞는 정수형을 지정할 수있는 방법이 없습니다 .
SK-logic

답변:


12

사용중인 아키텍처에 의해 정의됩니다. Zilog z80 칩 (공통 임베디드 칩)에서는 한 가지 크기이지만 x86 칩셋에서는 완전히 다른 크기 일 수 있습니다. 그러나 크기 자체는 서로 고정 된 비율입니다. 본질적으로 short와 long은 타입이 아니지만 int 타입에 적합합니다. 짧은 int는 (정규) int보다 1 배 작고 long int는 10 배 더 높습니다. 따라서 Int가 4 바이트로 바인딩되어 있다고 가정하면 짧은 한정자는 4 바이트로 묶고 2 바이트도 매우 일반적이며 긴 한정자는 4 바이트로 줄어들 수 있지만 잠재적으로 8 바이트로 향상시킵니다. 32 비트 시스템에서는 int 당 4 바이트로 최대 길이를 초과하여 일반 int와 동일하게 길게 만들 수 있습니다. 따라서 Short ≤ Int ≤ Long입니다.

그러나 다시 길게하면 int를 다음 셀로 푸시하여 8 바이트의 저장 공간을 제공 할 수 있습니다. 이것은 64 비트 기계의 단어 크기이므로 그러한 것들에 대해 걱정할 필요가 없으며 긴 ints에 대해 하나의 셀을 사용하여 표준 ints보다 다른 순서가되도록하지만 long long ints는 실제로 비트가됩니다.

어느 쪽을 선택해야하는지에 따라 Java 프로그래머가 걱정할 필요가없는 것으로 요약됩니다. "아키텍처는 무엇입니까?" 그것은 모두 해당 기계의 메모리의 워드 크기에 달려 있기 때문에 어떤 것을 사용할 것인지 결정하기 전에 그 메모리를 먼저 이해해야합니다. 그런 다음 메모리의 모든 비트 사용 여부에 관계없이 해당 메모리가 할당되므로 가능한 한 많은 메모리를 절약하기 위해 가장 작은 크기를 선택하십시오. 따라서 할 수있을 때 할 수있는 곳을 저장하고 할 수 없을 때 반바지를 골라 내고 할 수 없을 때 더 큰 무언가가 필요한 경우 상한선에 도달 할 때까지 필요에 따라 길어집니다. 그런 다음 많은 수의 루틴을 제공하거나 라이브러리에서 가져와야합니다.

C는 "휴대용 어셈블리"일 수도 있지만 여전히 하드웨어를 알아야합니다.


11
이것은 옳지 않다. 반바지는 ints보다 작을 필요는 없으며 ints보다 클 수는 없다
jk.

정정하겠습니다.
World Engineer

2
마찬가지로 long은 정수보다 작을 수 없습니다.
Donal Fellows

1
실제로 나는 정확히 같은 곳에서 짧고, int하고, 긴 기계가 있다고 생각합니다.
jk.

6

오늘날 "바이트"는 "8 비트"를 의미하지만 항상 그런 것은 아닙니다. 머신은 4 비트, 8 비트, 12 비트, 16 비트, 32 비트 및 36 비트 (및 다른 크기도 가능)의 주소 지정 가능 청크를 사용했습니다. C의 디자인 의도 중 하나는 메모리 크기와 구성이 다른 머신에서 사용할 수 있어야했습니다.

디자인 의도는 원래 다양한 유형 int의 다양한 크기를 처리 할 수있는 가장 작은 것 외에 int+/- 32767을 처리 할 수있는 가장 실용적인 "일반용"크기 인 것입니다. 나는 컴퓨터가 너무 강력 해져서 64 비트 숫자에 대한 연산이 작은 것에 대한 연산과 같은 비용이 들었을 때 여전히 사용되는 언어를 만들고자하는 의도 나 의도가 없다고 생각합니다.

C의 정수형 시맨틱의 가장 큰 문제는 어떤 문맥에서는 그것들이 기수 또는 수학 정수를 나타내는 반면, 다른 문맥에서는 정수의 합동적인 모드 2 ^ n의 래핑 추상 대수 고리의 멤버를 나타내는 데 사용된다는 것입니다. 0에서 표현할 수있는 최대 값은 1을 산출하도록 정의되지만, 동작은 컴퓨터 워드 크기가 약 16 비트 (36 비트 워드 크기가 클 때)에 컴파일러가 수행 한 작업에 따라 더 많이 지정됩니다. ), 64 비트 시스템에서 의미가있는 것이 아니라 결과적으로, 작은 부호없는 32 비트 값에서 32 비트 부호없는 값을 뺀 결과는 큰 32 비트 부호없는 값이거나 음의 64 비트 수일 수 있습니다.


4

/programming/589575/size-of-int-long-etc

따라서 가장 일반적으로 사용되는 아키텍처에서 char은 1 바이트이고 short 및 int는 2 바이트 이상이며 long은 4 바이트 이상입니다.

그리고 'int'는 현재 CPU에 대해 가장 자연스럽고 정상적이며 효율적인 표현이어야합니다.

따라서 일반적인 규칙은 값이 +/- 32K를 초과하지 않는 한 'int'를 사용하는 것입니다 (이전 CPU에서는 'long'사용). ... 또는 작은 (<32K) 값으로 큰 배열을 만들지 않는 한 메모리가 문제가되므로 메모리를 절약하기 위해 'short'를 사용하십시오 (또는 'char'또는 'byte').


2
그러나 64 비트를 사용 int하는 것이 좋은 선택이 아닙니다. 포팅 코드의 문제를 피하기 위해 어쨌든 거의 항상 size_t(또는 ptrdiff_t!) 사용합니다.
user541686

@Merhdad-int는 최선의 선택으로 HW의 '표준 단위', 일반적으로 포인터 크기로 간주되었습니다. 요즘 안전을 위해 size_t를 사용하십시오.
Martin Beckett

1

C는 다른 수준에서 메모리를 적극적으로 처리하도록 설계되었습니다. 메모리 제약, 아키텍처 등으로 인해 short, int 및 long과 float 및 double의 차이가 중요한 경우가 있습니다. 지금은 중요하지 않지만 여전히 포함 된 환경 (예 : 임베디드 및 데이터가 방대한 경우), 주로 32 비트 아키텍처에서 64 비트로 전환하면 문제가 다시 발생합니다. (128 비트 아키텍처로 전환하고 C / C ++가 여전히 인기있는 10 년 또는 20 년 안에 다시 문제가 될 것입니다). 이진 호환성이 문제가 되었더라도이 변수 유형 크기를 사용하지 않는 것이 좋습니다.

크기를 모르는 경우 어떤 아키텍처를 사용해야하는지에 대해 물었지만 주어진 아키텍처 / 컴파일러 조합의 크기를 알고 있으며 해당 수준에서 메모리를 최적화해야하는 경우 더 잘 알고 있어야합니다. 크기를 알 수 없기 때문에 단순히 여러 플랫폼에서 최적화 할 수 없으므로 해당 기능을 사용하지 않을 것입니다. 그러나 C로 작성된 많은 것들이 플랫폼에 따라 다르며, "크로스 플랫폼"방식에도 불구하고 유리한 최적화가 가능합니다.

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