2012-04-17 6 views
45

Powiel możliwe:
size of int, long, etc
Does the size of an int depend on the compiler and/or processor?
What decides the sizeof an integer?Jaki powinien być sizeof (int) na 64-bitowym komputerze?

Używam maszynę 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 
$ 

Kiedy wpadłem następujący program, mam sizeof(int) jak 4-bytes.

#include <stdio.h> 

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

    return 0; 
} 

Jeśli biegnę trochę maszynę 16-, 32- i 64-, to nie oznacza to, że wielkość statku integer jest 16-, 32- i 64- nieco odpowiednio?

W mojej maszynie znalazłem numer WORD_BIT pod numerem 32. Czy nie powinien to być 64 na komputerze 64-bit?

$ getconf WORD_BIT 
32 
$ 

I nie powinien być 64-bitssizeof(int) (8 bytes) w powyższym przypadku?

+3

Nie jestem osobą C, ale uważam, że rozmiar czegoś oprócz 'char' jest specyficzny dla kompilatora, a także niekoniecznie rozmiar słowa na procesorze. – Ryan

+0

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

+1

@minitech: char jest także kompilatorem specyficznym – Dani

Odpowiedz

35

nie musi być; "Maszyna 64-bitowa" może oznaczać wiele rzeczy, ale zazwyczaj oznacza, że ​​procesor ma tak duże rejestry. Rozmiar typu jest określany przez kompilator, który nie musi mieć nic wspólnego z rzeczywistym sprzętem (chociaż zazwyczaj to robi); w rzeczywistości różne kompilatory na tej samej maszynie mogą mieć różne wartości.

20

Niezupełnie. dla zgodności wstecznej jest to 32 bity.
Jeśli chcesz 64 bity masz long, size_t lub int64_t

+12

'long' jest 4 bajtami w systemie Windows 64. –

+18

@ JonathanLeffler: na normalnych systemach – Dani

+10

@Dani Co jest nienormalnego w 64-bitowym systemie Windows? Linux i Windows decydują się na implementację różnych [modeli danych] (https://en.wikipedia.org/wiki/64-bit#64-bit_data_models) dla swoich 64-bitowych implementacji, nie czyni to jednym bardziej normalnym niż drugi. – Praetorian

6

W języku C++ rozmiar int nie został określony jawnie. Mówi tylko, że musi mieć rozmiar przynajmniej short int, który musi być co najmniej tak duży, jak signed char. Rozmiar char w bitach również nie jest określony jawnie, chociaż sizeof (char) jest zdefiniowany jako 1. Jeśli chcesz 64-bitowego int, C++ 11 określa long long na co najmniej 64 bity.

+1

Powiedzenie, że rozmiar 'char' nie jest jawnie określony, jest mylący. 'sizeof (char)' jest 1 z definicji (więc znak to bajt). Jedyny "rozmiar", który jest różny, to liczba bitów, z których korzysta: 'CHAR_BITS', co najmniej 8. Zauważ, że bajt może mieć więcej niż 8 bitów. – Anthales

+0

Należy sprawdzić semantykę dotyczącą operatora 'sizeof'. Ponieważ nie mam standardowego dokumentu w C++, mogę tylko powiedzieć, co C99 ma do powiedzenia na ten temat (i wiem, że C++ się na to zgadza): "Operator' sizeof' daje rozmiar (w bajtach) swojego operandu. " i "Gdy zostanie zastosowany do operandu, który ma typ' char', 'unsigned char' lub' signed char', (lub jego kwalifikowana wersja), wynikiem jest 1 " – Anthales

+0

@Anthales masz absolutną rację, §5.3.3 w standardzie C++ 11. Dziękuję za wskazanie tego. – juanchopanza

48

Wielkość wskaźnika powinna wynosić 8 bajtów na dowolnym 64-bitowym kompilatorze C/C++, ale niekoniecznie wielkość int.

+9

To ważna obserwacja. Wskaźniki w architekturze 32-bitowej mają szerokość 32 bitów, co oznacza, że ​​nie mogą adresować więcej niż 4 GB pamięci. –

+0

Jaka jest definicja kompilatora 64b? Jeśli przestrzeń adresowa jest ograniczona do 4 GB 32b wskaźniki działałyby dobrze. – XTF

+0

@XTF Prawo i ** x32 ** to prawdziwa rzecz: architektura dla 64-bitowych procesorów, ale z 32-bitowymi wskaźnikami, 'int's i' long's: https: //wiki.debian .org/X32Port –