2012-04-17 16 views
45

Duplicar posible:
size of int, long, etc
Does the size of an int depend on the compiler and/or processor?
What decides the sizeof an integer?¿Cuál debería ser el tamaño de (int) en una máquina de 64 bits?

estoy usando una máquina 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 
$ 

cuando me encontré con el siguiente programa, me dio la sizeof(int) como 4-bytes.

#include <stdio.h> 

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

    return 0; 
} 

Si estoy corriendo una máquina 16-, 32- y 64- poco, entonces no significa que el tamaño de un integer es 16-, 32- y 64- bits, respectivamente?

En mi máquina, encontré que el WORD_BIT es 32. ¿No debería ser 64 en una máquina 64-bit?

$ getconf WORD_BIT 
32 
$ 

Y, no debe ser el sizeof(int)64-bits (8 bytes) en el caso anterior?

+3

No soy una persona C, pero creo que el tamaño de cualquier cosa excepto 'char' es específico del compilador, y tampoco es necesariamente del tamaño de una palabra en el procesador. – Ryan

+0

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

+1

@minitech: char es también compilador específico – Dani

Respuesta

35

no tiene que ser; La "máquina de 64 bits" puede significar muchas cosas, pero normalmente significa que la CPU tiene registros tan grandes. El tamaño de un tipo lo determina el compilador, que no tiene que tener nada que ver con el hardware real (aunque normalmente lo hace); de hecho, diferentes compiladores en la misma máquina pueden tener diferentes valores para estos.

20

No realmente. para compatibilidad con versiones anteriores es de 32 bits.
Si quieres 64 bits que tienen long, size_t o int64_t

+12

'long' es de 4 bytes en Windows 64. –

+18

@JonathanLeffler: en sistemas normales – Dani

+10

@Dani ¿Qué tiene de anormal Windows de 64 bits? Linux y Windows eligen implementar diferentes [modelos de datos] (https://en.wikipedia.org/wiki/64-bit#64- bit_data_de_datos) para sus implementaciones de 64 bits, no hace que uno sea más normal que el otro. – Praetorian

6

En C++, el tamaño de int no se especifica explícitamente. Simplemente le dice que debe tener al menos el tamaño de short int, que debe ser al menos tan grande como signed char. Tampoco se especifica explícitamente el tamaño de char en bits, aunque sizeof (char) se define como 1. Si quiere un int de 64 bits, C++ 11 especifica que long long tiene al menos 64 bits.

+1

Decir que el tamaño de 'char' no se especifica explícitamente es engañoso. 'sizeof (char)' es 1 por definición (por lo que un carácter es un byte). El único "tamaño" que varía es el número de bits que utiliza: 'CHAR_BITS', que es al menos 8. También tenga en cuenta que un byte puede tener más de 8 bits. – Anthales

+0

Necesita buscar la semántica sobre el operador 'sizeof'. Como no tengo un documento estándar de C++, solo puedo decirte lo que C99 dice al respecto (y sé que C++ está de acuerdo con esto): "El operador' sizeof' produce el tamaño (en bytes) de su operando. " y "Cuando se aplica a un operando que tiene el tipo' char', 'unsigned char', o' signed char', (o una versión calificada de los mismos) el resultado es 1 " – Anthales

+0

@Anthales tiene toda la razón, §5.3.3 en el estándar C++ 11. Gracias por señalar eso. – juanchopanza

48

El tamaño de un puntero debe ser de 8 bytes en cualquier compilador de C/C++ de 64 bits, pero no necesariamente el tamaño de int.

+9

Esta es una observación importante. Los punteros en la arquitectura de 32 bits tienen 32 bits de ancho, lo que significa que no pueden ocuparse de más de 4 GB de memoria. –

+0

¿Cuál es la definición de un compilador 64b? Si el espacio de direcciones está restringido a 4 GB, los punteros de 32b funcionarían bien. – XTF

+0

@XTF Correcto, y ** x32 ** es una cosa real que existe: una arquitectura para CPU de 64 bits pero con punteros de 32 bits, 'int's y' long's: https: //wiki.debian .org/X32Port –

Cuestiones relacionadas