Qubc
@Qubc
Ненавижу полисемию.

Сколько памяти занимает int в C?

Запутался.
Win7x64, консоль, MinGW.
1. Почему адресация по 4 байта?
Ведь это выглядит как 32-ух разрядная система, хотя установлена х64.
2. Почему int занимает 4 ячейки (то есть 16 байт), а не 1 ячейку (то есть 4 байта) ?
Если так и есть, и минимальная ячейка памяти равна 4 байтам, то понятно, почему char-у приходится занимать 4 байта, а не 1 байт.

#include <stdio.h>
int main(){
	int A[2] = {0};
	double B[2] = {0}; 
	char C[2] = {'A', 'B'};

		for (int i = 0; i < RANGE; ++i)	{
			printf("%d %p\n", i, &A[i] );
		}
		for (int i = 0; i < RANGE; ++i)	{
			printf("%d %p\n", i, &B[i] );
		}
		for (int i = 0; i < 4; ++i)	{
			printf("%d %p\n", i, &C[i] );
		}
		printf("long%d ", sizeof(long) );
		printf("int%d ", sizeof(int) );
		printf("char%d \n", sizeof(char) );
return 0;
}

Массив с int
0 0028FF2C
1 0028FF30
Массив с double
0 0028FF18
1 0028FF20
Массив с char
0 0028FF16
1 0028FF17

long4 int4 char1


Распутался:
Не нужно путать логическую адресацию и размер ячейки памяти. Ячейка памяти здесь - 8 бит или 1 байт.
Адресация здесь осуществляется с помощью 32-ух бит, то есть от 00 00 00 00 до FF FF FF FF.
  • Вопрос задан
  • 4901 просмотр
Решения вопроса 1
15432
@15432
Системный программист ^_^
1. Чтоб узнать адресацию, напечатайте sizeof(void*) или любого другого указателя. Может оказаться, что программа действительно скомпилирована в х86
2. Все норм у вас, 4 байта на int, 1 байт на char. Каждая "ячейка" в 1 байт, а не в 4
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Конкретный размер int зависит от архитектуры, под которую идёт компиляция. Начиная со стандарта C99 добавлены платформонезависимые типы, для int они определены в stdint.h
Ответ написан
Комментировать
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Нужно взять 64-битный компилятор и компилировать с флагом -m64.
Например:
gcc -m64 -o exmaple64 example.c
Ответ написан
Комментировать
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Влияют обычно несколько факторов.
- архитектура. x32, x64, другие процы - в них int может быть разного размера
- выравнивание в памяти. Можно задать прагму, которая будет принудительно выравнивать все на некую границу. Это используется редко, но помнится как-то мне было надо, чтобы области были гарантированно выровнены на 4 байта.

Для наиболее частого случая - int - 4 байта, short int - 2 байта, char - 1 байт
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы