long int의 사이즈는 항상 4바이트라고 가정해도 될까요?
라는 것이 항상 사실입니까?long int(제가 이해하기로는, 이 것은long)는4바이트 수?
믿어도 돼요?그렇지 않은 경우 POSIX 기반 OS에 해당될 수 있습니까?
표준에는 정수 타입의 정확한 사이즈에 대해서는 다음과 같이 기술되어 있지 않습니다.char.일반적으로.long는 32비트 시스템에서는 32비트, 64비트 시스템에서는 64비트입니다.
그러나 표준에는 최소 크기가 명시되어 있습니다.C 표준의 섹션 5.2.4.2.1부터:
1 아래에 제시된 값은 다음에서 사용하기에 적합한 상수 표현으로 대체해야 한다.
#if지시 전처리.더군다나, 을 제외하고.CHAR_BIT그리고.MB_LEN_MAX다음은 정수 승진에 따라 변환된 해당 유형의 객체인 식과 동일한 유형의 식으로 대체해야 한다.구현 정의 값은 같은 부호로 표시된 값과 크기(절대값) 이상이어야 합니다....
유형 객체의 최소값
long int
LONG_MIN-2147483647 // −(2^31−1)유형 객체의 최대값
long int
LONG_MAX+2147483647 // 2^31−1
여기 보면long int 최소 32비트여야 하지만 더 클 수 있습니다.그 기계에서CHAR_BIT는 8 이며, 최소 바이트사이즈는 4 입니다.단, 기계에서는 예를 들어CHAR_BIT16과 같음, along int는 2바이트 길이일 수 있습니다.
여기 실제 예가 있습니다.다음 코드의 경우:
#include <stdio.h>
int main ()
{
printf("sizeof(long) = %zu\n", sizeof(long));
return 0;
}
Debian 7 i686에서의 출력:
size of (long) = 4
Cent에서의 출력OS 7 x 64:
size of (long) = 8
그러니까 사이즈에 대한 추측은 할 수 없어요.특정 크기의 유형이 필요한 경우 에서 정의된 유형을 사용할 수 있습니다.stdint.h. 다음 유형을 정의합니다.
int8_t: 서명된 8비트uint8_t: 부호 없음8 비트int16_t: 서명된 16비트uint16_t: 부호 없는 16비트int32_t: 서명된 32비트uint32_t: 부호 없는 32비트int64_t: 서명된 64비트uint64_t: 부호 없는 64비트
그stdint.h헤더는 섹션 7.20.1.1에 정확한 폭 유형을 포함하여 표준의 섹션 7.20에 설명되어 있습니다.표준에서는 이러한 typedef는 옵션이지만 대부분의 구현에 존재합니다.
표준에서는 컴파일러에 완전히 의존합니다.즉, 같은 컴파일러라도 옵션과 타겟 아키텍처에 의존할 수 있습니다.
그러니까 안 돼.
여담이지만long int와 같을 수 있다long.
표준에는 의 크기에 대해서는 아무것도 기재되어 있지 않다.long int사용 환경에 따라 달라집니다.
사이즈를 구하려면long int사용자 환경에서sizeof연산자를 사용하여 크기를 구합니다.long int뭐랄까...
sizeof(long int)
C 표준에서는 타입의 사이즈에 관한 다음 사항만 필요합니다.
- int > = 16비트,
- long >= 32비트,
- 긴 길이(C99 이후)> = 64비트
- size of(char) <= size of(short) <= size of(int) <= size of(long) <= size of(long)>
- size of(char) == 1
- CHAR_BIT >= 8
나머지는 구현으로 정의되어 있기 때문에 int가 18/24/36/60비트, 보완서명이 있는 형식, size of(char) == size of(short) == size of(int) == size of(long) == 4, 48비트 long 또는 9비트 문자를 가진 시스템을 발견해도 이상하지 못할 것입니다.C기준
위의 long int에 대한 요점은 완전히 틀렸습니다.Linux/Unix 의 실장에서는, 긴 것은 64비트 타입으로 정의되고 있습니다만, Windows 에서는 32비트 밖에 되지 않습니다.이는 다른 데이터 모델을 사용하기 때문입니다(64비트 컴퓨팅의 표를 참조해 주세요).이것은 32비트 또는 64비트 OS 버전에 관계없이 사용할 수 있습니다.
아니요, "긴" 데이터 유형은 컴파일러마다 다르기 때문에 추측할 수 없습니다.
상세한 것에 대하여는, 이 기사를 봐 주세요.
ICL Series 39 하드웨어에 C를 처음 구현했을 때, 우리는 그 표준을 그대로 받아들여 데이터 유형을 그 머신 아키텍처의 자연 표현에 매핑했습니다.이것은 다음과 같습니다.short= 32비트,int= 64비트,long= 128비트
그러나 심각한 C 어플리케이션은 동작하지 않았습니다.모두 매핑을 상정하고 있습니다.short= 16,int= 32,long= 64를 지원하기 위해 컴파일러를 변경해야 했습니다.
공식 표준이 무엇을 의미하든 간에, 오랜 세월 동안 모든 사람들이 모여들어 왔습니다.long= 64비트이며 변경될 가능성이 없습니다.
아니요, C 표준과 POSIX 모두 이를 보증하지 않습니다.실제로 대부분의 Unix와 유사한 64비트 플랫폼에는 64비트(8바이트)가 있습니다.long.
코드 사용sizeof(long int)사이즈를 확인합니다.현재 작업 중인 시스템에서 긴 int 크기를 바이트 단위로 제공합니다.특히 당신의 질문에 대한 대답은 NO입니다.C, POSIX 등 어디에서도 보증되지 않습니다.
@delnan이 지적한 바와 같이 POSIX 구현은 다음 크기를 유지합니다.long그리고.int32비트 시스템과 64비트 시스템 간에 종종 다릅니다.
의 길이long는 대부분 하드웨어와 관련되어 있습니다(CPU 상의 데이터 레지스터의 크기와 일치하거나 OS 설계나 ABI 인터페이스 등의 기타 소프트웨어 관련 문제와 일치할 수 있습니다).
마음을 편하게 하기 위해서sizeof함수가 아니라 컴파일러 지시*입니다.따라서 코드에서는 이 명령어를 사용할 때 조작을 사용하지 않습니다.sizeof- 숫자 쓰는 거랑 똑같아, 휴대할 수 있어.
용도:
sizeof(long int)
* Dave가 댓글에서 지적했듯이sizeof가변 길이 배열을 사용하는 경우와 같이 컴파일 중에 값을 계산할 수 없는 경우 런타임에 계산됩니다.
그리고 또 다른 댓글에서도 지적했듯이sizeof는 실장에 의해 사용되는 패딩과 얼라인먼트를 고려합니다.즉, 실제 사용 중인 바이트는 메모리 크기와는 다를 수 있습니다(비트 시프트 시 중요할 수 있습니다).
특정 바이트 크기 변수를 찾고 있는 경우 바이트 배열 또는 (지원되는 것으로 간주됩니다) C99에서 정의된 유형을 사용하는 것을 고려하십시오.stdint.h- @dbush에서 제안한 대로.
컴파일러는 하드웨어와 OS의 종류에 따라 크기를 결정합니다.
따라서 사이즈에 대한 추측은 하지 말아야 합니다.
간단한 답변: 아니요! 당신은 그 크기에 대해 고정적인 가정을 할 수 없습니다.long int표준(C 표준 또는 POSIX)은 다음과 같은 크기를 문서화하지 않기 때문입니다.long int(반복적으로 강조되었듯이)당신의 믿음에 대한 반례를 제시하기 위해, 대부분의 64비트 시스템은long64사이즈!휴대성을 최대화하려면sizeof적당하게.
사용하다sizeof(long int)사이즈를 체크하기 위해서, 그것은 사이즈를 반환합니다.long바이트 단위입니다.값은 시스템 또는 환경에 따라 달라집니다.즉, 컴파일러는 하드웨어와 OS에 따라 크기를 결정합니다.
언급URL : https://stackoverflow.com/questions/35844586/can-i-assume-the-size-of-long-int-is-always-4-bytes
'programing' 카테고리의 다른 글
| 역동적인 소품 통과 방법 (0) | 2022.07.05 |
|---|---|
| VueJ에서 클릭 시 클래스 전환s (0) | 2022.07.05 |
| 기존 Vue 컴포넌트에 마크업 삽입 (0) | 2022.07.05 |
| Java에서 역순으로 목록 반복 (0) | 2022.07.05 |
| 스프링: 구현된 클래스가 아닌 인터페이스를 자동 배선하는 이유는 무엇입니까? (0) | 2022.07.05 |