Размер int и размер int указателя на 64-битной машине

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

Итак, я подумал о том, чтобы напечатать следующее:

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

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

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

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

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

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

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

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

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

Немного путайте здесь,

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

Во многих средах программирования для языков C и C на 64-битные машины, переменные "int" все еще 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*).

(Хотя, возможно, указатель должен иметь как минимум размер int. Hmmm)

Ответ 4

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

Ответ 5

Из-за size_t определяется как

typedef unsigned int size_t;

Вы должны отобразить его с помощью% zu,% u или% lu вместо% d.

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