C의 크기가 "int"가 2바이트인가 4바이트인가?
C의 정수 변수가 2바이트 또는 4바이트를 차지하는가?그것이 의존하는 요인은 무엇인가?
대부분의 교과서는 정수 변수가 2바이트를 차지한다고 한다.그러나 내가 프로그램을 실행하면 정수 배열의 연속적인 주소를 4의 차이를 보여준다.
와 동등하다는 것은 알고 있다.sizeof(int)
.의 크기의 int
컴파일러에 의존하고 있어과거, 프로세서가 16비트였던 시절,int
. 요즘에는 32비트 시스템뿐 아니라 64비트 시스템에서도 4바이트가 가장 많다.
여전히, 사용sizeof(int)
프로그램이 실행되는 특정 시스템의 정수 크기를 얻는 가장 좋은 방법이다.
편집: 잘못된 문 수정:int
대부분의 64비트 시스템에서 8바이트.예를 들어 64비트 GCC의 경우 4바이트다.
이것은 처음에는 혼동될 수 있는 C의 포인트 중 하나이지만, C 표준은 지원이 보장되는 정수형의 최소 범위만을 명시하고 있다. int
16비트가 필요한 -32767 ~ 32767을 잡을 수 있다고 보장한다.그 경우에는int
, 2바이트 입니다.그러나, 많은 현대 컴파일러들이 만드는 것을 볼 수 있듯이 구현은 그 최소 수준을 넘어서는 데 자유롭다.int
32비트(일반적으로 4바이트라는 의미도 있음)
네 책에 2바이트라고 쓰여 있는 이유는 아마도 오래되었기 때문일 거야.한때는 이것이 표준이었다.일반적으로, 당신은 항상 그것을 사용해야 한다.sizeof
운영자가 사용 중인 플랫폼의 바이트 수를 확인해야 할 경우
이를 해결하기 위해 C99는 예를 들어 특정 크기의 정수를 명시적으로 요청할 수 있는 새로운 유형을 추가했다.int16_t
또는int32_t
그 수 그 이전에는 특정 폭의 정수를 얻을 수 있는 보편적인 방법이 없었다(대부분의 플랫폼이 플랫폼별로 유사한 유형을 제공했음에도 불구하고).
구체적인 답은 없다.플랫폼에 따라 다르다.구현이 정의되어 있다.2개, 4개 또는 다른 것일 수 있다.
이면의 생각int
주어진 플랫폼에서 16비트 플랫폼에서 16비트, 32비트 플랫폼에서 32비트, 64비트 플랫폼에서 64비트라는 자연적인 "단어" 크기와 일치하도록 되어 있다는 것이었습니다.그러나 역호환성을 위해 일부 컴파일러는 32비트를 고집하는 것을 선호한다.int
64비트 플랫폼에서도.
2바이트의 시간int
한 오래되었지만(16?플랫폼?).단어의 크기가 16비트인 임베디드 플랫폼을 사용하지 않는 경우.너의 교과서는 아마 매우 오래되었을 것이다.
C99 N1256 표준안
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
의 크기int
기타 모든 정수 유형은 구현이 정의되며, C99는 다음을 명시한다.
- 최소규모 보장
- 종류간의 상대적 크기.
5.2.4.2.1 "정수 유형의 크기<limits.h>
"는 최소 크기를 제공한다.
1 [...] 이들의 구현 정의 값은 표시된 값과 같거나 더 커야 한다(절대 값). [...]
- UCAR_MAX 255 // 2 8 - 1
- USHRT_MAX 65535 // 2 16 − 1
- UINT_MAX 65535 // 2 16 − 1
- ULON_MAX 4294967295 // 2 32 - 1
- ULLON_MAX 18446744073709551615 // 2 64 - 1
6.2.5 "유형"은 다음과 같이 말한다.
8 부호가 같고 정수 변환 순위가 다른 두 정수 유형의 경우(6.3.1.1 참조), 정수 변환 순위가 더 작은 유형의 값 범위는 다른 유형의 값의 하위 범위다.
및 6.3.1.1 "부울, 문자 및 정수"는 상대 변환 순위를 결정한다.
1 모든 정수 종류에는 다음과 같이 정의된 정수 변환 순위가 있다.
- 긴 int의 등급은 긴 int 등급보다 커야 하며, int 등급보다 커야 하며, 짧은 int 등급보다 커야 하며, 서명된 int 등급보다 커야 한다.
- 서명되지 않은 정수 유형의 순위는 해당 서명된 정수 유형의 순위와 같아야 한다.
- 모든 정수형 T1, T2, T3에 대해 T1의 순위가 T2보다 크고 T2의 순위가 T3보다 크면 T1의 순위가 T3보다 크다.
C의 크기가 "int"가 2바이트인가 4바이트인가?
답은 "예" / "아니오" / "아마" / "아니오" 입니다.
C 프로그래밍 언어는 다음을 지정한다: 주소 지정 가능한 최소 단위(알고 있는 사람:char
그리고 "바이트"라고도 불리는데, 정확히CHAR_BIT
비트를 넓게, 어디에CHAR_BIT
적어도 8살은 된다.
따라서 C의 1바이트가 반드시 8비트인 옥텟은 아니다.과거 C 코드(및 Unix)를 실행한 첫 번째 플랫폼 중 하나는 4바이트였습니다.int
- 하지만 총합으로int
36비트를 가지고 있었다, 왜냐하면CHAR_BIT
9살이었어!
int
최소한 의 범위를 가진 플랫폼의 자연 정수 크기여야 한다.의 사이즈를 알 수 있다.int
와의 플랫폼 바이트로sizeof(int)
이 때 ; 이 을 때CHAR_BIT
당신은 그것의 폭이 몇 조각인지 알 것이다.
36비트 컴퓨터는 대부분 죽었지만, 8비트 바이트가 아닌 플랫폼은 여전히 존재한다.바로 어제 16비트 바이트의 텍사스 인스트루먼트 MCU에 대한 질문이 있었는데, 이 MCU는 C99, C11 호환 컴파일러를 가지고 있다.
TMS320C28x에서는char
short
그리고int
모두 16비트 폭이며, 따라서 1바이트가 된다. long int
2바이트 입니다.long long int
입니다4바이트 입니다.C의 장점은 여전히 이런 플랫폼을 위한 효율적인 프로그램을 쓸 수 있고, 심지어 휴대용 방식으로도 할 수 있다는 것이다!
어떤 플랫폼을 사용하느냐에 따라 이 질문에 대한 답이 달라진다.
그러나 플랫폼에 관계 없이 다음과 같은 유형을 신뢰성 있게 가정할 수 있다.
[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
,바이트 및CHAR_BIT
, 및 수 있는 표현...토끼굴을 파고 들어가 직접 보자...
sizeof
,바이트 및CHAR_BIT
C표준(위와 연계)에서 따온 다음 문장은 이것을 개선될 수 없다고 생각되는 단어로 설명한다.
그
sizeof
연산자는 피연산자의 크기(바이트)를 산출하며, 이는 형식의 표현식 또는 괄호화된 이름일 수 있다.크기는 피연산자의 유형으로 결정된다.
명확한 이해를 전제로 하면 바이트에 대한 논의로 이어질 것이다.일반적으로 바이트가 8비트라고 가정하는데, 실제로 바이트에 몇 개의 비트가 있는지 알려준다.그것은 일반적인 2바이트 정수를 말할 때 고려되지 않는 또 다른 뉘앙스 중 하나일 뿐이다.
지금까지의 일을 마무리합시다.
sizeof
=> 크기(바이트 단위),CHAR_BIT
=> 바이트 단위의 비트 수
그러므로, 당신의 시스템에 따라,sizeof (unsigned int)
마치 0보다 큰 값(단 2 또는 4는 아님)이 될 수 있다.CHAR_BIT
16이고, 그러면 단일(입력 비트) 바이트는 표준에 의해 기술된 16비트 정수를 나타내기에 충분한 비트를 가지고 있다(아래 참조).그게 꼭 유용한 정보는 아니지, 그렇지?좀 더 깊이 조사해 봅시다...
정수 표현
C 표준은 모든 표준 정수 유형에 대한 최소 정밀도/범위를 지정한다(및CHAR_BIT
여기도, fww)이다.이를 통해 값을 저장하는 데 필요한 비트의 수를 최소화할 수 있지만 범위를 기준으로 변수를 선택하는 편이 나을 수 있다.그럼에도 불구하고, 이 답변에 필요한 세부사항의 상당 부분이 여기에 있다.예를 들어 다음과 같은 표준이unsigned int
필요16인치(이것의 Stsberty)
UINT_MAX 65535 // 2¹⁶ - 1
따라서 16비트가 필요한 것을 알 수 있으며, 여기서 2바이트를 얻을 수 있다(추정).CHAR_BIT
8)...그리고 나중에 그 한도가 로 증가했을 때2³² - 1
사람들은 대신 4바이트를 말하고 있었다.이것은 당신이 관찰한 현상들을 설명한다.
대부분의 교과서는 정수 변수가 2바이트를 차지한다고 한다.그러나 내가 프로그램을 실행하면 정수 배열의 연속적인 주소를 4의 차이를 보여준다.
당신은 고대의 교과서와 컴파일러를 사용하고 있는데, 그것은 당신에게 휴대할 수 없는 C를 가르쳐주고 있다; 당신의 교과서를 쓴 작가는 심지어 알지 못할지도 모른다.CHAR_BIT
교과서(및 컴파일러)를 업그레이드하고, I.T는 경쟁하기 위해 앞서야 하는 끊임없이 발전하는 분야라는 것을 기억하도록 노력해야 한다...하지만 그것에 대해서는 충분하다; 그 기본적인 정수 바이트들이 저장하는 다른 어떤 비휴대용 비밀들을 살펴보자...
가치 비트는 일반적인 오해들이 계산하고 있는 것처럼 보이는 것이다.위의 예에서는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바이트 정수의 일반적인 오해는 이러한 세부사항을 무시한다.)
단 한 가지 보장은 다음과 같다.char
너비가 8비트 이상이어야 한다.short
그리고int
너비가 16비트 이상이어야 하며,long
너비가 32비트 이상이어야 하며,sizeof (char)
<=sizeof (short)
<=sizeof (int)
<=sizeof (long)
(이러한 유형의 서명되지 않은 버전에 대한 정의는 참이다.)
int
플랫폼에 따라 폭이 16비트에서 64비트 사이일 수 있다.
#include <stdio.h>
int main(void) {
printf("size of int: %d", (int)sizeof(int));
return 0;
}
이것은 4를 반환하지만, 기계에 의존하는 것일 겁니다.
C의 크기가 "int"가 2바이트인가 4바이트인가?
C의 정수 변수가 2바이트 또는 4바이트를 차지하는가?
C는 "바이트"가 "바이트"당 8비트가 아닌 것을 허용한다.
CHAR_BIT
비트 필드(바이트) C11dr §5.2.4.2.1 1이 아닌 가장 작은 개체의 비트 수
8보다 더 큰 가치는 점점 더 흔하지 않다.휴대성을 극대화하기 위해CHAR_BIT
8시보다는 8시.의 int
Bits in C 는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
의int
INT_MAX
+32767
C11dr §5.2.4.2.1 1
에 대한 최소 범위int
프로세서가 "8비트"인 경우에도 비트 크기가 최소 16이 되도록 강제한다.64비트와 같은 크기가 전문 프로세서에서 나타난다.18, 24, 36 등과 같은 다른 가치들은 역사적인 플랫폼에서 발생했거나 적어도 이론적으로는 가능하다.현대식 코딩은 2의 힘이 아닌 것에 대해 거의 걱정하지 않는다.int
비트 사이즈
는 컴의 로로(로路)를 한다.int
비트 크기 선택
64비트 프로세서를 사용하더라도 컴파일러는int
대형 코드 기반이 의존하기 때문에 호환성을 위해 크기는 32비트일 수 있다.int
32비트(또는 32/16).
주로 사용하는 플랫폼에 따라 달라진다.그것은 컴파일러에서 컴파일러로 다르다.오늘날 대부분의 컴파일러는 4바이트가 된다.컴파일러에서 사용하는 것을 확인하려면sizeof(int)
.
main()
{
printf("%d",sizeof(int));
printf("%d",sizeof(short));
printf("%d",sizeof(long));
}
단, c 컴파일러가 약속하는 것은 int보다 작거나 같아야 하며, 긴 int보다 크거나 더 커야 한다는 것이다.그래서 만약 int의 크기가 4라면, 짧은 것의 크기는 2 또는 4일 수도 있지만 그것보다 크지는 않다.긴 시간동안이나 마찬가지야.그것은 또한 짧고 긴 크기가 같을 수 없다고 말한다.
그러나 이 질문은 일종의 항상 진실과 진실이다. "그렇다.둘 다."
그것은 당신의 건축양식에 달려있다.16비트 이하의 컴퓨터에서 작업할 경우에는 4바이트(=32비트)가 될 수 없다.32비트 이상의 시스템에서 작업하는 경우 길이는 32비트 입니다.
알아내려면, 읽을 수 있는 것을 출력할 준비를 하고 "sizeof" 기능을 사용하십시오.이렇게 하면 선언된 데이터 유형의 크기(바이트)가 반환된다.그러나 이것을 배열과 함께 사용하여 가득 채워라.
선언할 거면int t[12];
그것은 12*4바이트를 반환할 것이다.이 어레이의 길이를 가져오려면sizeof(t)/sizeof(t[0])
해야 한다. 함수를 빌드하려면 송신 배열의 크기를 계산해야 함을 기억하십시오.
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는 두 가지 기능을 정의함으로써 파악할 수 있으며 어느 정도 성능을 놓친다.함수(array t)를 정의하고 함수2(array t, int size_of_t)를 정의한다.function(t)을 호출하여 복사 작업으로 길이를 측정하고 결과를 function2로 전송하십시오. 여기서 가변 배열 크기에서 원하는 작업을 수행할 수 있다.
이는 구현에 따라 다르지만, 일반적으로 x86 및 ARM과 같은 다른 인기 있는 아키텍처에 의존한다.int
4바이트가 필요하다.컴파일 시 항상 다음을 사용하여 확인할 수 있음sizeof(int)
다른 유형도 확인해 보십시오.
특정 크기 유형을 사용하려면<stdint.h>
참조URL: https://stackoverflow.com/questions/11438794/is-the-size-of-c-int-2-bytes-or-4-bytes
'programing' 카테고리의 다른 글
C에서 함수 호출 재정의 (0) | 2022.05.26 |
---|---|
Flex/lex의 문자열 리터럴에 대한 정규식 (0) | 2022.05.26 |
분할("|")을 사용하여 파이프 기호를 기준으로 Java 문자열 분할 (0) | 2022.05.26 |
TypeError로 인해 Vuex+Jest 테스트가 실패함 (0) | 2022.05.25 |
형식 지정 구성 요소에서 Vue 프로토타입 속성에 액세스하는 방법 (0) | 2022.05.25 |