C의 정수 변수가 2 바이트 또는 4 바이트를 차지합니까?
사용중인 플랫폼과 컴파일러 구성 방법에 따라 다릅니다. 신뢰할 수있는 유일한 대답은 sizeof
연산자 를 사용 하여 특정 상황에서 정수의 크기를 확인하는 것입니다.
그것이 의존하는 요인은 무엇입니까?
size가 아니라 range 가 가장 잘 고려 될 수 있습니다 . 두 가지 모두 실제로 다를 수 있지만 우리가 볼 수 있듯이 크기보다 범위에 따라 변수 유형을 선택하는 것이 훨씬 더 멍청합니다. 또한 표준은 크기가 아닌 범위를 기준으로 정수 유형을 선택하는 것을 고려하도록 권장 하지만, 지금 은 표준 사례를 무시 하고 호기심 , 바이트 및 정수 표현을 탐구 합시다. 토끼 구멍과 자신을 위해 그것을보고 ...sizeof
CHAR_BIT
sizeof
, 바이트 및 CHAR_BIT
C 표준 (위에 링크 됨)에서 가져온 다음 진술은 이것을 개선 할 수 없다고 생각하는 단어로 설명합니다.
sizeof
연산자 식 또는 유형의 괄호 이름 일 수있다 피연산자의 크기 (바이트)를 산출한다. 크기는 피연산자의 유형에 따라 결정됩니다.
명확한 이해가 있다면 바이트 에 대한 논의로 이어질 것 입니다. 실제로 바이트에 몇 비트가 있는지 알려 주면 바이트 는 8 비트 라고 가정합니다 . 그것은 일반적인 2 바이트 (또는 4 바이트) 정수에 대해 이야기 할 때 고려되지 않는 뉘앙스 중 또 하나입니다.CHAR_BIT
.
지금까지 내용을 마무리하겠습니다.
sizeof
=> 크기 (바이트)
CHAR_BIT
=> 바이트 단위의 비트 수
따라서, 시스템에 따라 sizeof (unsigned int)
있을 수 있는 것보다 값이 큰 영 (단지 2 또는 4)의 경우로서 CHAR_BIT
16 다음 단일 (여섯 비트) 바이트 열 여섯 비트 정수가 설명 표현에 충분한 비트가 표준 (아래 인용). 반드시 유용한 정보는 아닙니다. 그렇지 않습니까? 더 깊이 탐구합시다 ...
정수 표현
C 표준은 여기 에 모든 표준 정수 유형 (및 CHAR_BIT
fwiw) 의 최소 정밀도 / 범위를 지정합니다 . 이것으로부터 우리는 값 을 저장하기 위해 필요한 비트 수에 대한 최소값 을 도출 할 수 있지만 범위에 따라 변수를 선택할 수도 있습니다 . 그럼에도 불구하고이 답변에 필요한 세부 사항 중 상당 부분이 여기에 있습니다. 예를 들어, 표준에 따르면 16 비트 이상의 스토리지가 필요합니다.unsigned int
UINT_MAX 65535 // 2¹⁶ - 1
따라서 우리는 unsigned int
2 바이트 를 얻는 곳 ( 최소한 ) 16 비트 가 필요 하다는 것을 알 수 있습니다 ( CHAR_BIT
8이 가정 ) ... 그리고 그 한계가로 증가하면 2³² - 1
사람들은 대신 4 바이트를 진술하고있었습니다. 이것은 당신이 관찰 한 현상을 설명합니다 :
대부분의 교과서에서는 정수 변수가 2 바이트를 차지한다고 말합니다. 그러나 정수 배열의 연속 주소를 인쇄하는 프로그램을 실행하면 4의 차이가 표시됩니다.
당신은 이식이 불가능한 C를 가르치는 고대 교과서와 컴파일러를 사용하고 있습니다. 당신의 교과서를 쓴 저자는 알지 못할 수도 있습니다 CHAR_BIT
. 당신은 해야한다 교과서 (컴파일러)를 업그레이드하고, IT는 끊임없이 진화하는 필드는 유지해야한다는 것을 기억하기 위해 노력하고 앞으로의 경쟁 ...하지만 그것에 대해 충분히에; 기본 정수 바이트가 저장 하는 다른 이식 불가능한 비밀이 무엇인지 보자 ...
가치 비트 는 일반적인 오해가 계산하는 것으로 보입니다. 위의 예는 unsigned
일반적으로 값 비트 만 포함 하는 정수 유형을 사용 하므로 악마를 자세하게 놓치기 쉽습니다.
부호 비트 ... 위의 예 에서는 주석 에서 값을 추출하는 것이 간단한 예이므로 UINT_MAX
상한으로 인용 했습니다 . 부호있는 유형의 경우 양수 값과 음수 값 (기호)을 구별하려면 부호 비트도 포함해야합니다.unsigned int
16
INT_MIN -32768 // -(2¹⁵)
INT_MAX +32767 // 2¹⁵ - 1
패딩 비트 ... 패딩 비트가 정수인 컴퓨터는 흔하지 않지만 C 표준을 사용하면 가능합니다. 일부 기계 (예 : 이 기계 )는 두 개의 작은 (부호있는) 정수 값을 함께 결합하여 더 큰 정수 유형을 구현합니다 ... 부호있는 정수를 결합하면 낭비되는 부호 비트가 생깁니다. 즉 낭비되는 비트를 고려 패딩 포함될 수 패딩 비트 C. 다른 실시 예에서는 패리티 비트 및 트랩 비트 .
당신이 볼 수 있듯이, 표준과 같은 범위를 고려하고 장려하는 것 같다 INT_MIN
.. INT_MAX
및 기타 최소 / 표준에서 최대 값을 정수 타입을 선택하고, 스타일을 장려 가능성 등을 잊어서는 다른 미묘한 요인이 있기 때문에 크기에 의존 CHAR_BIT
하고 패딩 비트가있는 의 가치에 영향을 줄 수 있습니다 sizeof (int)
(즉, 2 바이트 및 4 바이트 정수 의 일반적인 오해는 이러한 세부 사항을 무시합니다).