2012-04-17 2 views
45

가능한 중복 :
size of int, long, etc
Does the size of an int depend on the compiler and/or processor?
What decides the sizeof an integer?64 비트 시스템에서 sizeof (int)는 무엇이되어야합니까?

나는 64-bit 기계를 사용하고 있습니다.

$ uname -m 
x86_64 
$ file /usr/bin/file 
/usr/bin/file: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped 
$ 

은 내가 4-bytessizeof(int)있어, 다음과 같은 프로그램을 실행합니다. 나는 16-, 32-64- 비트 컴퓨터를 실행 해요 경우

#include <stdio.h> 

int main(void) 
{ 
    printf("sizeof(int) = %d bytes\n", (int) sizeof(int)); 

    return 0; 
} 

, 다음은 integer의 크기가 16-, 32-64- 비트가 각각 것을 의미하지 않는다?

제 컴퓨터에서 WORD_BIT32입니다. 64-bit 기기의 경우 64이 아니어야합니까?

$ getconf WORD_BIT 
32 
$ 

그리고, sizeof(int)는 상기 경우 64-bits (8 bytes)이어야한다?

+3

저는 C 인물이 아니지만,'char'을 제외한 모든 것의 크기는 컴파일러에 따라 다르며 반드시 프로세서의 단어 크기는 아닙니다. – Ryan

+0

http://stackoverflow.com/questions/589575/size-of-int-long-etc – Perception

+1

@minitech : char도 컴파일러에만 해당 – Dani

답변

35

int64_t가 될 필요가 없습니다있다; "64 비트 머신"은 많은 것을 의미 할 수 있지만 일반적으로 CPU에 큰 레지스터가 있음을 의미합니다. sizeof a type은 컴파일러에 의해 결정됩니다. 컴파일러는 실제 하드웨어와 아무런 관련이 없습니다 (보통은 그렇게 하긴하지만). 사실, 같은 머신에있는 서로 다른 컴파일러는 서로 다른 값을 가질 수 있습니다.

20

아니요. 하위 호환성을 위해 32 비트입니다. 64 개 비트를 원하는 경우
당신은 long, size_t 또는

+12

Windows 64에서'long '은 4 바이트입니다. –

+18

@JonathanLeffler : 일반 시스템의 경우 – Dani

+10

@Dani 64 비트 Windows의 경우 비정상적인 현상이 발생합니까? Linux와 Windows는 64 비트 구현을 위해 서로 다른 [데이터 모델] (https://en.wikipedia.org/wiki/64-bit#64-bit_data_models)을 구현하기로 선택하고 다른 하나보다 정상적인 것은 아닙니다. – Praetorian

6

C++에서 int의 크기는 명시 적으로 지정되지 않습니다. 단지 최소한 short int 크기 여야하며, 적어도 signed char 크기 여야합니다. sizeof (char)가 1로 정의되어 있더라도 char의 비트 수는 명시 적으로 지정되지 않습니다. 64 비트 int가 필요한 경우 C++ 11은 최소 64 비트가되도록 long long을 지정합니다.

+1

'char'의 크기가 명시 적으로 지정되지 않았다는 것은 오도 된 것입니다. 'sizeof (char)'는 정의에 의해 1입니다 (char는 1 바이트입니다). 가변적 인 유일한 "크기"는 사용하는 비트 수입니다 : CHAR_BITS는 8 이상입니다. 바이트는 8 비트 이상을 가질 수 있습니다. – Anthales

+0

'sizeof' 연산자에 대한 의미를 찾아야합니다. 저는 C++ 표준 문서가 없으므로 C99에서 이것에 관해서 만 말할 수 있습니다 (그리고 저는 C++이 이것에 동의합니다) : "sizeof' 연산자는 피연산자의 크기 (바이트)를 산출합니다. " 와 "타입 char, unsigned char 또는 signed char가있는 피연산자에 적용되면 결과는 1" – Anthales

+0

@Anthales 당신이 정말로 옳다. §5.3.3 C++ 11 표준. 그 점을 지적 해 주셔서 감사합니다. – juanchopanza

48

포인터의 크기는 64 비트 C/C++ 컴파일러에서는 8 바이트 여야하지만 int 크기 일 필요는 없습니다.

+9

이것은 중요한 관찰 사항입니다. 32 비트 아키텍처의 포인터는 32 비트 폭이므로 4GB 이상의 메모리를 처리 할 수 ​​없습니다. –

+0

64b 컴파일러의 정의는 무엇입니까? 주소 공간이 4GB 32b로 제한되면 포인터가 정상적으로 작동합니다. – XTF

+0

@XTF Right, ** x32 **는 존재하는 실제 존재합니다 : 32 비트 포인터, int 및'long's를 가진 64 비트 CPU 아키텍처 : https : //wiki.debian .org/X32Port –