почему sizeof (int) == 4, а не 2?
От: Аноним  
Дата: 23.07.07 08:56
Оценка:
Здраствуйте.
почему так? а на 64 битной системе инт будет занимать 64 разряда?
Re: почему sizeof (int) == 4, а не 2?
От: _Ursus_  
Дата: 23.07.07 08:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здраствуйте.

А>почему так? а на 64 битной системе инт будет занимать 64 разряда?

This behavior is by design (c)
Если речь о винде, то в Win32 int — 32 битный. В Win64 — тоже (как ни странно).
Re: почему sizeof (int) == 4, а не 2?
От: Bell Россия  
Дата: 23.07.07 09:00
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здраствуйте.

А>почему так? а на 64 битной системе инт будет занимать 64 разряда?

Размер встроенных типов вообще, и int-а в частности в стандарте не фиксирован, и является платформо-зависимым.
Исключение составляют char типы — в данном случае sizeof == 1.
Любите книгу — источник знаний (с) М.Горький
Re[2]: почему sizeof (int) == 4, а не 2?
От: Pavel Dvorkin Россия  
Дата: 23.07.07 09:19
Оценка:
Здравствуйте, _Ursus_, Вы писали:

_U_>Если речь о винде, то в Win32 int — 32 битный. В Win64 — тоже (как ни странно).


Ничего странного тут нет. Много найдется задач, в которых для целой арифметики не хватает 2 (4) миллиардов ? А если найдутся — __int64 и вперед. А так незачем тратить память понапрасну!
With best regards
Pavel Dvorkin
Re: почему sizeof (int) == 4, а не 2?
От: apilikov Россия  
Дата: 23.07.07 09:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здраствуйте.

А>почему так? а на 64 битной системе инт будет занимать 64 разряда?

потому что размер int в 32-разрядной системе всегда 4.
Re: почему sizeof (int) == 4, а не 2?
От: Аноним  
Дата: 23.07.07 09:37
Оценка: +2
А>Здраствуйте.
А>почему так? а на 64 битной системе инт будет занимать 64 разряда?
1==sizeof(char)<=sizeof(short)<=sizeof(int)<=sizeof(long)
Вот и все что говорит стандарт С++ по поводу sizeof этих типов. Остальное — на усмотрение разработчиков компиляторов. Хоть 10 хоть 1 байт на int — главное чтобы указанное соотношение выполнялось.
Re: почему sizeof (int) == 4, а не 2?
От: Кодт Россия  
Дата: 23.07.07 09:52
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>почему так? а на 64 битной системе инт будет занимать 64 разряда?


Ты наконец пересел с TurboC на программирование под виндоуз?
Тогда — если на Borland C Builder, то соболезную, а в остальных случаях поздравляю
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: почему sizeof (int) == 4, а не 2?
От: Аноним  
Дата: 23.07.07 10:34
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, <Аноним>, Вы писали:


А>>почему так? а на 64 битной системе инт будет занимать 64 разряда?


К>Ты наконец пересел с TurboC на программирование под виндоуз?

К>Тогда — если на Borland C Builder, то соболезную, а в остальных случаях поздравляю
да не, с виндовса и vc я начинал, сайчас юзаю gcc под linux. Спасибо за поздравление

в linux функция poll принимает в аргументе таймаут int, Юзер передаёт в прогу число в секундах, это число я умножаю на 1000 и передаю poll, если int будет 2 байта и юзер укажет больше 32 сек, то функции poll передастся отрицтельное число, и она будет вечно ждать события в дискрипторе, вопрос; если на компе где будет запущена программа, int будет 2 байта, может случиться так что poll будет вечно ждать?

заранее спасибо.
Re[3]: почему sizeof (int) == 4, а не 2?
От: Кодт Россия  
Дата: 23.07.07 10:52
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>в linux функция poll принимает в аргументе таймаут int, Юзер передаёт в прогу число в секундах, это число я умножаю на 1000 и передаю poll, если int будет 2 байта и юзер укажет больше 32 сек, то функции poll передастся отрицтельное число, и она будет вечно ждать события в дискрипторе, вопрос; если на компе где будет запущена программа, int будет 2 байта, может случиться так что poll будет вечно ждать?


Вроде бы 16-битных линуксов нет на свете, так что можно расслабиться.
Ну а контролировать ввод юзера нужно в любом случае.
int const MaxTimeout = INT_MAX; // или взять из документации по poll
int const ScaleTimeout = 1000;
int const MaxTimeoutSec = MaxTimeout / ScaleTimeout;

int timeoutSec;
cout << "Введите задержку (в секундах, 0.." << MaxTimeoutSec << ") ";
cin >> TimeoutSec;
if(timeoutSec < 0 || timeoutSec > MaxTimeoutSec)
{
    cout << "Прекратите хулиганить! Милицию позову!" << endl;
    return;
}
int timeout = timeoutSec * ScaleTimeout;

pollfd(fds, count, timeout);
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[4]: почему sizeof (int) == 4, а не 2?
От: Аноним  
Дата: 23.07.07 12:27
Оценка:
Здравствуйте, Кодт, Вы писали:


Ко всему выше сказанному всеми товарищами добавлю вот эту ссылку: Перенос Linux-приложений на 64-разрядные системы
Re[2]: почему sizeof (int) == 4, а не 2?
От: achp  
Дата: 23.07.07 12:57
Оценка: +1
Здравствуйте, apilikov, Вы писали:

A>потому что размер int в 32-разрядной системе всегда 4.


Неправда. Если байт 32-разрядный, то sizeof (int) == 1.
Re[2]: почему sizeof (int) == 4, а не 2?
От: GarryIV  
Дата: 23.07.07 21:16
Оценка:
Здравствуйте, Bell, Вы писали:

А>>Здраствуйте.

А>>почему так? а на 64 битной системе инт будет занимать 64 разряда?

B>Размер встроенных типов вообще, и int-а в частности в стандарте не фиксирован, и является платформо-зависимым.

B>Исключение составляют char типы — в данном случае sizeof == 1.

sizeof == 1 не всегда равно 8 бит. Сколько бит занимает char тоже implementation defined.
WBR, Igor Evgrafov
Re[3]: почему sizeof (int) == 4, а не 2?
От: johny5 Новая Зеландия
Дата: 24.07.07 06:10
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, _Ursus_, Вы писали:


_U_>>Если речь о винде, то в Win32 int — 32 битный. В Win64 — тоже (как ни странно).


PD>Ничего странного тут нет. Много найдется задач, в которых для целой арифметики не хватает 2 (4) миллиардов ? А если найдутся — __int64 и вперед. А так незачем тратить память понапрасну!


Если я не ошибаюсь, int задаётся как наиболее удобно аппаратно представимым целым числом, т.е. на практике совпадает с битностью архитектуры, а что в Win64 (а он, как я понимаю, работает в 64х битном режиме с 64х битными регистрами и логикой комманд) int есть 32 бита, хм.

Получается что компилятор обязательно вынужден генерить
and op, 0x00000000ffffffff
почти после каждой операцией с int(также, как в 32х битном режиме он сейчас работает с short). Я бы не сказал что это есть замечательный способ сэкономить память да ещё и в производительности потерять.
Re[4]: почему sizeof (int) == 4, а не 2?
От: Pavel Dvorkin Россия  
Дата: 25.07.07 05:03
Оценка:
Здравствуйте, johny5, Вы писали:

J>Получается что компилятор обязательно вынужден генерить
and op, 0x00000000ffffffff
почти после каждой операцией с int(также, как в 32х битном режиме он сейчас работает с short). Я бы не сказал что это есть замечательный способ сэкономить память да ещё и в производительности потерять.


Я сейчас попробовал (увы, под рукой только Visual Studio 6.0)

8: short a, b = 0,c = 0;
9: a = b + c;
00401028 movsx eax,word ptr [ebp-8]
0040102C movsx ecx,word ptr [ebp-0Ch]
00401030 add eax,ecx
00401032 mov word ptr [ebp-4],ax

Так что здесь никаких and не понадобилось. А вот

8: unsigned short a, b = 0 ,c = 0;
9: a = b + c;
00401028 mov eax,dword ptr [ebp-8]
0040102B and eax,0FFFFh
00401030 mov ecx,dword ptr [ebp-0Ch]
00401033 and ecx,0FFFFh
00401039 add eax,ecx
0040103B mov word ptr [ebp-4],ax

действительно, как ты и говоришь.

В общем, надо посмотреть генерируемый код. Увы, сейчас не могу.

А насчет экономии памяти — все равно верно. Один массив на 1000 элементов с лишком перекроем все лишние байты команд.
With best regards
Pavel Dvorkin
Re: почему sizeof (int) == 4, а не 2?
От: ionicman  
Дата: 25.07.07 05:20
Оценка: -5 :)
Здравствуйте, Аноним, Вы писали:

А>Здраствуйте.

А>почему так? а на 64 битной системе инт будет занимать 64 разряда?
Потому что:
1) нет стандарта на тип int — в компиллере можно вообще любой задать
2) мелкомягкие идиоты просто. это акиома к сожелениею

Вообще обычно когда ведется кроссплатформенная разработка, подразумевается что
char 1 byte
word 2 bytes
dword 4 bytes
qword 8 bytes
поскольку int == integer то бишь целочисленное число, и сним бывает куча проблем как раз изза вот таких приколов —
лучше использовать перечисленные выше типы, т.к. всегда можно сделать typedef

Кстати отсюда же есть очень грустная проблеа с bound для структур — выравнвание по слову
Re[5]: почему sizeof (int) == 4, а не 2?
От: johny5 Новая Зеландия
Дата: 25.07.07 07:46
Оценка: -1
PD>А насчет экономии памяти — все равно верно. Один массив на 1000 элементов с лишком перекроем все лишние байты команд.

Этот массив, по умолчанию, будет выровнен по 8 байтной границе. Потому что процессор считывает по выровненному адресу быстрее.
Re[2]: почему sizeof (int) == 4, а не 2?
От: Dynamite Украина  
Дата: 25.07.07 07:52
Оценка:
Здравствуйте, ionicman, Вы писали:

I>Здравствуйте, Аноним, Вы писали:


А>>Здраствуйте.

А>>почему так? а на 64 битной системе инт будет занимать 64 разряда?
I>Потому что:
I>1) нет стандарта на тип int — в компиллере можно вообще любой задать
I>2) мелкомягкие идиоты просто. это акиома к сожелениею

Да,поливать мелкомягих — самое то

I>Вообще обычно когда ведется кроссплатформенная разработка, подразумевается что

I>char 1 byte
I>word 2 bytes
I>dword 4 bytes
I>qword 8 bytes
I>поскольку int == integer то бишь целочисленное число, и сним бывает куча проблем как раз изза вот таких приколов —
I>лучше использовать перечисленные выше типы, т.к. всегда можно сделать typedef

I>Кстати отсюда же есть очень грустная проблеа с bound для структур — выравнвание по слову


При чём тут машинные слова???
Re[4]: почему sizeof (int) == 4, а не 2?
От: elmal  
Дата: 25.07.07 08:02
Оценка: +1
Здравствуйте, johny5, Вы писали:

J>Получается что компилятор обязательно вынужден генерить
and op, 0x00000000ffffffff
почти после каждой операцией с int(также, как в 32х битном режиме он сейчас работает с short). Я бы не сказал что это есть замечательный способ сэкономить память да ещё и в производительности потерять.

Если не ошибаюсь, генерить этот and или нет от оптимизации под процессор зависит. По крайней мере для 32 битных процессоров никто 16 битные команды не отменял (как и 8-и битные), вполне логично было бы их использовать без всяких "and". Другое дело, что может оказаться, что с "and" возможно это просто выполняется быстрее в конечном счете (тот же прикол получается, как и с инкрементом и сложением на единицу — прибавлять единицу оказывается выгоднее), я уже например давно не могу предстказать скорость выполнения программы на ассемблере и не знаю хитростей оптимизации. А уж как там для 64-битных процессоров это оказывается, вообще не представляю, не читал даже в детстве
Re[2]: почему sizeof (int) == 4, а не 2?
От: SWW Россия  
Дата: 25.07.07 10:20
Оценка: +1
Здравствуйте, ionicman, Вы писали:

I>1) нет стандарта на тип int — в компиллере можно вообще любой задать


Да ты что! Научи меня, а то я не умею

I>2) мелкомягкие идиоты просто. это акиома к сожелениею


Очень к месту. А чтобы не быть идиотом какой размер int надо ставить?

I>Вообще обычно когда ведется кроссплатформенная разработка, подразумевается что

I>char 1 byte
I>word 2 bytes
I>dword 4 bytes
I>qword 8 bytes

Ты будешь удивлен, но даже char может занимать больше 1 байта. Гарантируется лишь sizeof(char)==1
Остальных типов в стандарте вообще нет.

I>Кстати отсюда же есть очень грустная проблеа с bound для структур — выравнвание по слову


А какие проблемы могут быть с выравниванием по слову? Нужно лишь знать что размер структуры в общем случае не равен сумме размеров ее составляющих. И обращаться к полям по именам, а не умничать с адресами — и будет тебе щастье.
Re[2]: почему sizeof (int) == 4, а не 2?
От: MShura  
Дата: 25.07.07 10:46
Оценка:
I>Вообще обычно когда ведется кроссплатформенная разработка, подразумевается что
I>char 1 byte
I>word 2 bytes
I>dword 4 bytes
I>qword 8 bytes
I>поскольку int == integer то бишь целочисленное число, и сним бывает куча проблем как раз изза вот таких приколов —

По поводу размеров. На моей любимой платформе 1=sizeof(char)=sizeof(short)=sizeof(int) (32 бита)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.