2013-12-21 5 views
15

Мне просто интересно, как я могу узнать, есть ли у моего ноутбука 64-разрядная или 32-разрядная машина. (это 64).Размер int и sizeof указателя int на 64-битной машине

Так, я думал о печати следующее:

int main() 
{ 
printf("%d",sizeof(int)); 
} 

и результат был 4, который, казалось странным (так как это 64 бит машина)

Но, когда я напечатал:

int main() 
{ 
printf("%d",sizeof(int*)); 
} 

результат был 8, что имело больше смысла.

Возникает вопрос:

Поскольку я использую 64 битной машине, не должен примитивный тип такой, как INT должен использовать 8 байт

(64 бит) и тем, что SizeOf междунар должно быть 8? Почему это не так?

И почему размер int * равен 8?

немного запутался здесь,

так спасибо заранее.

+7

Не используйте '% d' для печати' size_t', он вызывает UB. –

+1

http://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models – Mat

+1

64-битная архитектура не изменяет целочисленную модель по сравнению с 32 бит. Только длина адреса/указателя. – user2672165

ответ

18

Нет, sizeof(int) определяется реализацией и обычно составляет 4 байта.

С другой стороны, для того, чтобы адресовать более 4 ГБ памяти (эти 32-разрядные системы могут выполнять), вам нужны ваши указатели шириной 8 байтов. int* просто держит адрес «где-то в памяти», и вы не можете адресовать более 4 ГБ памяти всего за 32 бита.

+2

Примечание: память для кода, постоянных данных, стека, динамических данных, различных типов данных и т. д. может существовать в отдельных подразумеваемых _сегментах или адресных пространствах, поэтому адрес для каждого может быть 32 бит, а _each_ - 4 ГБ. Таким образом, общая сумма превышает 4 ГБ. Эта модель означает, что адрес функции и адрес данных имеют одинаковое «значение», но будут отличаться по-разному, поскольку их подразумеваемые сегменты отличаются. Рассмотрим архитектуру Гарварда (https://en.wikipedia.org/wiki/Harvard_architecture), популярную для различных встроенных процессоров. C переносится на многие схемы адресов. – chux

+0

Означает ли это, что более эффективно использовать память 'int * t = malloc (sizeof (int))', а не 'int i = 1; int * t = & i'? – wulfgarpro

15

Размер указателя должен быть 8 байтов на любом 64-битном компиляторе C/C++, но то же самое не соответствует размеру int.

wiki имеет хорошее объяснение о том, что:

Во многих средах программирования для C и C-производных языков на 64-разрядных машинах, «ИНТ» переменные все еще 32 бита, но долго целые числа и указатели имеют ширину 64 бит. Они описаны как имеющие модель данных LP64. Другой альтернативой является модель данных ILP64 в , в которой все три типа данных имеют ширину 64 бит и даже SILP64, где «короткие» целые числа также имеют ширину 64 бит. [Править] Однако в большинстве случаев требуемые модификации относительно незначительны и простой, и многие хорошо написанные программы могут быть просто перекомпилированы для новой среды без изменений. Другой альтернативой является модель LLP64, которая поддерживает совместимость с 32-разрядным кодом , оставляя как int, так и long как 32-разрядную. «LL» относится к «длинному длинному целочисленному» типу, который по крайней мере 64 бит на всех платформах, , включая 32-разрядные среды.

3

sizeof(int), sizeof(int*) и «размер машины», хотя часто коррелируют друг с другом, каждый может быть независимо друг от друга меньше, такой же или больше, чем другие.Единственное требование C состоит в том, что они должны быть не менее 16 бит (или так) - кроме этого, он компилятор зависит от sizeof(int), sizeof(int*).

(Хотя, возможно, указатель должен быть по крайней мере, размер внутр. Хммм)

+0

, то почему sizeof (char *) также дает «8» в некоторых случаях? –

+0

@UdbhavKalra 'sizeof (char *)' в некоторых случаях 8, поскольку размер указателя на 'char' равен 8. Он может быть 4, 2 или даже 1, 3 или 6 на новых платформах. Как насчет 8 ты находишь сомнительным? – chux

+0

Я только что проверил sizeof (int *) (char *), на моей платформе он дал только 8. Итак, я подумал, что может быть причиной этого? –

2

Программисты любят иметь целые типы 1, 2, 4 и 8 байт или 8, 16, 32 и 64 бита. Существует только два целочисленных типа, которые могут быть меньше, чем int: char и short. Если int был 64 бита, то вы не могли бы иметь все три размера 8, 16 и 32 бита. Вот почему компиляторы имеют тенденцию делать int = 32 бит, поэтому вы можете иметь char = 8 бит, short = 16 бит, int = 32 бит, long long = 64 бит и long = 32 бит или 64 бит.

0

Из size_t был определить, как

typedef unsigned int size_t; 

Вы должны показать его с% цей,% и или% л вместо% D.

printf("%zu\n", sizet); 
printf("%u\n", sizet); 
printf("%lu\n", sizet); 
+1

'size_t' не определен как' unsigned int'. 'size_t' - некоторый целочисленный тип без знака в ширину _least_ 16 бит. Использование 'printf ("% zu \ n ", sizet);' правильно, другие могут вызывать неопределенное поведение. – chux

Смежные вопросы