이것은 아마도 어리석은 질문은 그 대답을 아마도 알고있다.
십년 전에 또는 그렇게 많은 C 코드가 나는'd 봐야했 톤의 정수 typedef 에서는 특정 플랫폼`#ifdef 습니다. 그것은 듯 모든 프로그램이나 라이브러리에서 나는 보았다 자신의,상호 호환이 되지 않는 typedef 수프입니다. 지 않았't know 전체에 대해 많은 프로그래밍이 시간에 그것은 듯과 같은 기묘한 무리의 농구를 통해 이동하는지 알려드리기 위해 컴파일러는 어떤 종류의 정수를 이용하고 싶었다.
나는've 함께 이야기에서 내 마음이 무엇인지 설명하는 그 형식 정의했지만,나는't 이 실제로는지 여부를 알's true. 나의 추측은 기본적으로 하는 경우 C 처음 개발하고 표준화,아니었't 깨달은 그것이 얼마나 중요 한지를 할 수 있는 플랫폼을 독립적으로 얻는 정수형 특정 크기의하고,따라서 모든 원래 C 정수한 유형의 수 있습니다 다른 크기에 서로 다른 플랫폼에 따라 다릅니다. 따라서 모든 사람을 작성하려고 portable C 코드 그것을 해야 했다.
이것은 정상인가요? 그렇다면,방법었프로그래머를 사용할 것으로 예상된 C 정수 유형? I mean,낮은 수준에서 언어의 많은 비 만지작거리지 않't 것이 중요하다고 말할 수 있"이것은 32 비트 정"? 그리고 이후 언어 표준은 1989 년에,반드시 거기에 몇 가지 생각하는 사람들을 위해 노력하고있을 것이라고 쓰 휴대용 코드?
경 C 기 시작했 컴퓨터 적은 균일은 연결되어 오늘보다. 그것으로 보였다 더 중요한 이동성을 int 유형의 크기는(s)에 대한 컴퓨터입니다. 를 요청하고 정확하게 32 비트 정수형에 36-비트 시스템에서 아마가 결과에서 비효율적인 코드.
그리고 함께 보급 네트워킹 당신은 특정에서-와이어 크기는 필드가 있습니다. 지금 상호 운용성을 보이는 전체를 많이 다르다. 고는'octet'가 사실상의 콴타 데이터의 유형입니다.
지금 당신은 필요한 수의 정확한 배수의 8 비트,그래서 지금 당신은 당신을 얻을 typedef 수프고 그 후에 결국은 표준을 잡는다고 우리는 표준 이름이 그들을 먹지 않으로 필요합니다.
C's 이전에 성공했으로 인해 이 flexibility 에 적응하기는 거의 기존의 모든 변형 아키텍처에[@John Hascall](https://stackoverflow.com/questions/43407298/what-was-with-the-historical-typedef-soup-for-integers-in-c-programs#comment73886365_43407298 로): 1)기본 크기의 _integer_8, 16, 18, 24, 32, 36, etc. 비 2)변수 모델:2's 보완,1's 보완 서명 정수 3)다양한 endian,크고 작은기타.
으로 코딩을 개발,알고리즘과 상호 교환의 데이터를 위한 더 큰 그래서 균일성과에 대한 필요는 형식을 만난 1&2 위의 플랫폼에서. 더 압 자신과 같은typedef int int32
내부#if...
. 의 많은 변화를 만든 스프로 주목에 의해 OP.
C99 도입(u)int_leastN_t,(u)int_fastN_t,(u)intmax_t
하게 휴대가 아직 somewhat 의 최소한 비트-폭-ness 형식입니다. 이러한 유형은 필요한 N=8,16,32,64.
또한 도입은 반 optional 종류(아래 참**)처럼(u)intN_t
는 추가적인 특성 그들은 해야 합니다 2's 보완하고 더 편리합니다. 그것은 이러한 대중적인 유형은 그렇게 널리하고 사용하는 얇은 integer soup.
어떻게 프로그래머를 사용할 것으로 예상된 C 정수 유형?
유연한 코드를 작성하여하지 않았다 강하게 의존하는 비트에 폭입니다. 하 코드strtol()사용하여
유일한LONG_MIN,사용 하여
에 관계없이트-폭이/endian/정수 인코딩이 있습니다.
아직 많은 코딩 작업을 강요한 정확한 폭 유형과 2's 보완을 위한 쉬운 고성능 코딩이다. 그것은 더 나은에서는 사례를 지내 이동성 36-비트 컴퓨터 및 32 비트 로그인 크기는 사람과 함께 스틱 2N넓은(2's 보완 서명)정수입니다. 다양한 CRC&암호화 알고리즘과 파일 형식이 마음에 와서. 따라서 필요한 고정 너비 종류 및 지정(C99)지 방법이 될 수 있습니다.
오늘은 여전히 있문제점는 여전히 처리될 필요가 있습니다. 예를 들어:일반적인 프로모션int/서명되지 않은
잃어로 이러한 유형될 수 있습 16,32/64.
**
이러한 형식은 선택사항입니다. 그러나,경우에는 구현을 제공하는 정수형으로 widths8,16,32,64 비트,no 패딩 비트,그리고(에 대한 서명된 형식)가 있는 두 개의 보충 표현,그것을 정하여야 한 해당 typedef 이름입니다. C11 7.20.1.1 정확한 폭 정수 유형 3
내가 기억하는 기간 동안 나는'm 의 죄 하고 있다.
중 하나가 문제의int
,그것과 동일할 수 있습으로짧다
,또는길
에서 또는 사이 있습니다. 예를 들어,만약 당신이 작업을 바이너리 파일 형식,그것은 필수적이었는 모든 것을 맞춥니다. 바이트로 주문하는 복잡한 것 같습니다. 많은 개발자에 갔으로 그냥fwrite
의 어떤 대신 따기의 숫자가 떨어져 바이트. 을 때 컴퓨터로 업그레이드는 더 이상 워드 길이,모든 지옥 느슨한 끊었다. 그래서typedef
었는 쉽게 해킹을 얻는다.
면 성능에 문제가 발생했으로,그것은 종종 다음,int
었을 보장하는 기계's 는 가장 빠른 자연적인 크기,그러나 당신이 필요한 32 비트,그리고int
보다 짧았다는,당신이 위험에 처해의 롤오버.
C 언어에서sizeof()
지 않 해결을 위해서는 전처리기계,하는 일이 복잡하기 때문에 당신은 수't do#는 경우에 sizeof(int)==4
에 대한 예입니다.
개인적으로 일부의 근거에도 있었다 단지 작업에서 어셈블러 언어를 사고 방식이 되지 않는 기꺼이 밖으로 추상적으로의 개념은 무엇이짧다
,int
그리고길
이다. 그 당시에는,어셈블러에 사용되었 C 다.
요즘에는 많은 비즈-바이너리 파일 포맷,JSON,XML,etc. 어디 그't 무슨 이진 표현입니다. 뿐만 아니라,많은 인기 있는 플랫폼에 정착 32-bitint
또는 더 일반적으로 충분히 대부분의 목적으로,그래서 거기's 의 더 적은 문제가와줍니다.
C 는 제품의 1970 년대 초반,때 컴퓨팅 생태계는 매우 다릅니다. 대신 모든 컴퓨터의 수백만 이야기를 각각 다른 확장된 네트워크를,당신은 어쩌면 천지 시스템,각 실행하는 몇 가지 단편적 애플리케이션과 함께,거의 통신 간 시스템입니다. 당신수't가정은 어떤 두 개의 아키텍처에 같은 단어는 크기,또는 표현에 서명 정수에서 동일한 방법입니다. 시장은 여전히 충분히 작은 것이 아니었't 어떤 percieved 필요로하는 표준화,컴퓨터지 않았't 을 서로 이야기(많은)및 아무도 하지만 많은에 대한 휴대성.
그렇다면,어떻게 프로그래머를 사용할 것으로 예상된 C 정수 유형?
는 경우에 당신을 쓰고 싶을 극대로 휴대용 코드,그 다음 당신이't 는 아무것도 가정이 무엇인지를 넘어 표준을 보장합니다. 의 경우에는int
,그 의미를't 다고 가정 할 수있는 것을 나타내는 범위 밖의[-32767,32767]
도 않았을 것이라고 표현에서 2's 보완하 며,당신은 가정이었다 특정 너비(수 보다 넓은 16 비트,그러나 아직도만을 대표 16 비트 범위는 경우에 포함된 모든 패딩 bits).
지 않은 경우에는't 케어에 대한 이동성,또는 당신은 하고 있었다는 것은 본질적으로 비용 휴대용(는 비트를 만지작거리고 일반적으로)를 사용한 모든 유형(들)만났습니다.
나는 대부분은 높은 수준의 프로그래밍 응용 프로그램,그래서 나는 더 적은 걱정에 대해 표현보다 내가에 대한 범위입니다. 그럼에도 불구하고,나는 가끔하는 데 필요한 복각 바이너리로 다운 표현,그리고 그것은 항상 나 비트에 엉덩이입니다. 나 기억을 쓰는 코드에서는 초'90 년대에는에서 실행하는 고전적인 맥 os,Windows3.1,and Solaris. 내가 무리를 만들었의 열거하기 위한 상수를 32 비트 마스크는 일에 Mac 과 Unix 상자이지만,실패를 컴파일에서 윈도우 상기 때문에 윈도우에서는int
16 비트.
C 도록 설계되었으로 언어할 수 있는 이식으로 넓은 범위의 기계로 가능한가 아닌 언어할 수 있는 가장 종류의 프로그램을 실행할 수정하지 않고에서 이러한 범위의 기계입니다. 가장 실용적인 목적을 위해,C's 유형들:
*8 비트 유형에 사용 가능한 경우,또는 다른 작은 유형는's 에서 적어도 8 비트입니다.
*16 비트 유형에 사용 가능한 경우,또는 다른 작은 유형는's 에 최소한 16 비트입니다.
*32 비트 유형에 사용 가능한 경우,또는 다른 몇 가지 유형는's 에 최소 32 비트입니다.
*유형이 32 비트 시스템 처리할 수 있습과 같은 것들을 효율적으로 16 비트 종류,비트 또는 16 비트지 않습니다.
는 경우에 필요한 코드 8,16,32 비트 종류와 것 가능성을 사용할 수 있는 컴퓨터에서는 지원하지 않았다,그들이't 어떤 특별한 문제로 이러한 코드에 대한char
,짧다
,그리고장
으로 8,16,32 비트,각각합니다. 유일한 시스템는't 지도 그 이름을 해당 유형 것 그는't support 그 유형과 않을 것't 할 수 있 유용하게 처리하는 코드가 필요합니다. 이러한 시스템을 것입 제한 코드를 작성했던 작성과 호환되는 형식을 사용합니다.
나는 생각 C 할 수 있게 될 것으로 전망 레시피로 변환하기 위한 시스템 사양으로 언어 있습니다. 시스템을 사용하는 36 비트 메모리 승't 실 수 있기를 효율적으로 프로세스는 같은 언어를 시스템으로 사용하는 octet-기반 메모리,하지만 프로그래머들을 배운 하나 방언을 것을 배울 수 있는 또 다른 단순히 학습하여 어떤 정수 표현 후자를 사용합니다. It's 훨씬 더 유용하게 프로그래머들의 요구를 쓰는 코드 36-bit 시스템,"이 기계는 다른 기계를 제외한char
은 9 비트짧다
는 18 비트,그리고장가
36 비트"하는 것보다 말이"이 있을 사용하여 어셈블리 언어를 다른 언어로 모든 필요한 정수형 이 시스템을 수 있't 프로세스를 효율적으로".
지 않는 모든 시스템은 동일한 기본 단어 크기입니다. 하는 동안 당신은 유혹 될 수 있습을 생각하는 작은 변수 크기는 것이 더 효율적이고,그것은 다만 아't 니다. 사실에서 사용하는 변수와 같은 크기의 기본 단어의 크기는 CPU 훨씬,훨씬 더 빠르게 연산,논리적이고 비 조작 작업입니다.
하지만,정확히,"기본 단어 크"? 거의 항상,이미 등록한 크기의 CPU,과 같은 산술 논리 유닛(ALU)할 수 있습니다.
에 포함된 환경에서,여전히 같은 것들을 8 과 16 비트 Cpu(을 수도 있 4-비트 컨트롤러 그림?). 이 있는 산의 32 비트 프로세서 거기다. 래의 개념"기본 단어 크"은 살아있고 잘 C 개발자입니다.
64 비트 프로세서,있는 것은 종종 좋은 32 비트 피연산자를 사용합니다. 실제 사용,32 비트 정수 및 부동 소수점의 값을 수보다 더 빠르게 풀어 크기입니다.
또한,trade-offs between 기본 단어를 정렬하고 전반적으로 메모리를 소모할 때 레이아웃 C 구조입니다.
하지만 이 두 가지 일반적인 사용 패턴에 남아 있:크기에 관계없 코드 개선을 위해 속도(int,short,long),또는 고정 크기(int32_t,int16_t,int64_t)에 대한 정확성 또는 상호 운용성이 필요합니다.