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
이것은 a가 최소 32 비트 long int
여야 하지만 더 클 수 있음을 의미합니다. 8 인 머신에서는 CHAR_BIT
최소 바이트 크기가 4입니다. 그러나 예를 들어 CHAR_BIT
16 인 머신에서는 long int
길이가 2 바이트 일 수 있습니다.
다음은 실제 사례입니다. 다음 코드의 경우 :
#include <stdio.h>
int main ()
{
printf("sizeof(long) = %zu\n", sizeof(long));
return 0;
}
Debian 7 i686의 출력 :
sizeof (long) = 4
CentOS 7 x64의 출력 :
sizeof (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는 선택 사항이지만 대부분의 구현에 존재합니다.
아니요, C 표준도 POSIX도이를 보장하지 않으며 실제로 대부분의 Unix 계열 64 비트 플랫폼 에는 64 비트 (8 바이트)가 long
있습니다.
코드를 사용 sizeof(long int)
하고 크기를 확인하십시오. 현재 작업중인 시스템에서 long int의 크기 (바이트)를 제공합니다. 특히 귀하의 질문에 대한 대답은 아니오입니다. C 또는 POSIX 또는 어느 곳에서도 보장되지 않습니다.
@delnan 가리키는 아웃으로 POSIX 구현의 크기를 유지 long
하고 int
지정 등을하고 종종 32 비트 및 64 개 비트 시스템 사이에서 차이가있다.
의 길이 long
는 대부분 하드웨어 와 관련이 있습니다 (종종 CPU의 데이터 레지스터 크기와 일치하며 때로는 OS 설계 및 ABI 인터페이스와 같은 기타 소프트웨어 관련 문제).
마음을 편하게하기 위해 sizeof
, 함수가 아니라 컴파일러 지시문 *이므로 코드는 사용할 때 작업을 사용하지 않습니다 sizeof
. 숫자를 쓰는 것과 동일하지만 이식 가능합니다.
사용하다:
sizeof(long int)
* Dave가 주석에서 지적했듯이 sizeof
가변 길이 배열을 사용할 때와 같이 컴파일 중에 값을 계산할 수없는 경우 런타임에 계산됩니다.
또한 다른 주석에서 지적했듯이 sizeof
구현에서 사용되는 패딩 및 정렬을 고려합니다. 즉, 사용중인 실제 바이트가 메모리의 크기와 다를 수 있습니다 (비트 시프트시 중요 할 수 있음).
특정 바이트 크기 변수를 찾고 있다면 바이트 배열을 사용하거나 stdint.h
@dbush가 제안한대로 C99에서 정의한 유형 (지원되는 것으로 가정)을 사용하는 것이 좋습니다.
ICL Series 39 하드웨어에 C를 처음 구현했을 때 표준을 그대로 사용하고 데이터 유형을 해당 머신 아키텍처의 자연스러운 표현 ( short
= 32 비트, int
= 64 비트, long
= 128 비트)에 매핑했습니다 .
그러나 우리는 심각한 C 애플리케이션이 작동하지 않는다는 것을 발견했습니다. 그들은 모두 매핑 short
= 16, int
= 32, long
= 64를 가정했고 이를 지원하기 위해 컴파일러를 변경해야했습니다.
따라서 공식 표준이 말하는 것이 무엇이든, 수년 동안 모든 사람이 long
64 비트로 수렴했으며 변경 될 가능성이 거의 없습니다.
표준 의 크기에 대해 아무것도 말하지 않는다 long int
, 그래서 당신이 사용하는 환경에 따라 달라집니다.
long int
환경에서 의 크기를 얻으려면 sizeof
연산자를 사용하고 long int
. 같은 것
sizeof(long int)
C 표준은 유형의 크기에 대해 다음 사항 만 필요합니다.
- int> = 16 비트,
- long> = 32 비트,
- long long (C99 이후)> = 64 비트
- sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
- sizeof(char) == 1
- CHAR_BIT >= 8
The remaining are implementations defined, so it's not surprised if one encountered some systems where int has 18/24/36/60 bits, one's complement signed form, sizeof(char) == sizeof(short) == sizeof(int) == sizeof(long) == 4, 48-bit long or 9-bit char like Exotic architectures the standards committees care about and List of platforms supported by the C standard
The point about long int above is completely wrong. Most Linux/Unix implementations define long as a 64-bit type but it's only 32 bits in Windows because they use different data models (have a look at the table here 64-bit computing), and this is regardless of 32 or 64-bit OS version.
The compiler determines the size based on the type of hardware and OS.
So, assumptions should not be made regarding the size.
From Usrmisc's Blog:
The standard leaves it completely up to the compiler, which also means the same compiler can make it depend on options and target architecture.
So you can't.
Incidentally long int
is the same as long
.
Short answer: No! You cannot make fixed assumptions on the size of long int
. Because, the standard (C standard or POSIX) does not document the size of long int
(as repeatedly emphasized). Just to provide a counter example to your belief, most of the 64 bit systems have long
of size 64! To maximize portability use sizeof
appropriately.
Use sizeof(long int)
to check the size, it returns the size of long
in bytes. The value is system or environment dependent; meaning, the compiler determines the size based on the hardware and OS.
참고URL : https://stackoverflow.com/questions/35844586/can-i-assume-the-size-of-long-int-is-always-4-bytes
'programing tip' 카테고리의 다른 글
fragmentpageradapter에서 조각 재사용 (0) | 2020.10.31 |
---|---|
VM 및 PyCharm으로 사용자 지정 PYTHONPATH를 구성하는 방법은 무엇입니까? (0) | 2020.10.31 |
ActiveRecord : 대량 할당 할 수있는 모델의 모든 속성을 얻는 방법은 무엇입니까? (0) | 2020.10.31 |
gem install json -v 1.7.3은 '빌드 도구를 포함하도록 PATH를 업데이트하십시오'를 제공합니다. (0) | 2020.10.31 |
한 스토리 보드에서 다른 스토리 보드로 뷰 컨트롤러 이동 또는 복사 (0) | 2020.10.31 |