Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ С\С++ _ Различия типов int и short

Автор: AD 29.12.2010, 9:10

Вопрос для общеобразовательной цели - в чем различие типов short и int? Поискал в интернете - ответы настолько противоречивые, что так и не пришел к одному выводу. Основным различием называют то, что short всегда 16-разрядный, а int зависит от платформы и компилятора, но даже это многими оспаривается. А есть ли точный ответ?

Автор: panter_dsd 29.12.2010, 10:04

Это и есть точный. short всегда 16, а int нет.

Автор: AD 29.12.2010, 10:09

Цитата(panter_dsd @ 29.12.2010, 10:04) *
Это и есть точный. short всегда 16, а int нет.

Почитай, я не зря спросил.... Точного мнения нет. Точно известно лишь одно, с чем никто не спорит, что sizeof(short) <= sizeof(int)! Все. Остальное может оспариваться!

Автор: kwisp 29.12.2010, 10:28

AD,

Цитата(AD @ 29.12.2010, 10:09) *
Все. Остальное может оспариваться!

ну и смысл оспаривать?
все понимают что многое зависит от компилятора, к примеру.
очевидно что не все компиляторы соблюдают стандарт. как в стандарте написано мы все знаем что обсуждать и о чем спорить в чём разбираться не понятно.

Автор: ufna 29.12.2010, 10:30

AD, а чего тут оспаривать? Проверь размеры. short 2 байта, инт на 32 бит системе 4 байта. Все просто. Инт зависит от разрядности системы, short всегда 2 байта. Поэтому если система 16 битная, то размеры равны, иначе - инт больше. Это чисто на практике можно проверить.

Автор: Litkevich Yuriy 29.12.2010, 11:39

AD, это требование стандарта:
short - фиксированный размер
int - в зависимости от платформы/компилятора
long - фиксированный размер

например, для микроконтроллеров PICmicro и AVR
short - 16 бит
int - 16 бит
long - 32 бита

Автор: Влад 29.12.2010, 12:33

Юрий, тогда уж упомяни - какого именно стандарта?

Автор: panter_dsd 29.12.2010, 12:37

Да, и желательно пруф.

Автор: AD 29.12.2010, 15:37

Цитата(ufna @ 29.12.2010, 10:30) *
AD, а чего тут оспаривать? Проверь размеры. short 2 байта, инт на 32 бит системе 4 байта. Все просто. Инт зависит от разрядности системы, short всегда 2 байта. Поэтому если система 16 битная, то размеры равны, иначе - инт больше. Это чисто на практике можно проверить.

Я не спорю, что sizeof(short) меньше sizeof(int). Меня смущает формулировка:
Цитата
short всегда 16, а int нет.

Это не так, как я узнал. Например, если байт будет не 8 бит, а меньше, то уже такое определение не подходит.

Вот точноe onpeделенue из вики. Язык крайне простой, потому без перевода:
Цитата
In computer programming, a short integer is a data type that can represent a whole number which may take less storage, while having a smaller range, compared with a standard integer on the same machine.
A variable defined as a short integer in one programming language may be different in size to a similarly defined variable in another. In some languages this size is fixed across platforms, while in others it is machine dependent. In some languages this datatype does not exist at all.
In C, it is denoted by short. It is required to be at least 16 bits, and is often smaller than a standard integer, but this is not required[1][2]. A conforming program can assume that it can safely store values between −215 and 215-1, but it may not assume that the range isn't larger. In Java, a short is always a 16-bit integer. In the Windows API, the datatype SHORT is defined as a 16-bit signed integer on all machines[3].
[edit]Common sizes

© http://en.wikipedia.org/wiki/Short_integer

Автор: ufna 29.12.2010, 18:34

AD,

Типы данных привязаны к байтам, а не к битам, поэтому если битность у системы другая и байт к примеру 9 бит или 12 бит (С и С++ работают с 8 и выше битами по стандарту), то соответственно размер типов меняется, но "Type int is an integral type that is larger than or equal to the size of type short int, and shorter than or equal to the size of type long".

Таким образом, если отбросить вопросы битности и байтности, то инт - тупо больше или равно шорт. И разница как раз в больше или равно, не более чем.

Автор: Алексей1153 29.12.2010, 18:43

ну я как обычно с костылями ))

Если это нужно применить на практике и это критично, то можно просто поставить проверку (для компилятора или в рантайме) -

#if sizeof(int)!=4
...предупреждение
#endif


if(sizeof(int)!=4)
{
   ... предупреждение
   throw;
}


и данный метод надёжен и непобедим

Автор: panter_dsd 29.12.2010, 23:30

Костыльный костыль. ИМХО, лучше сделать typedef int8 (16, 32, etc)

Автор: DEADHUNT 30.12.2010, 22:20

Цитата(Litkevich Yuriy @ 29.12.2010, 11:39) *
AD, это требование стандарта:
short - фиксированный размер
int - в зависимости от платформы/компилятора
long - фиксированный размер

какая страница? насколько я помню стандартом гарантируется только что sizeof(char) == 1.

Автор: Litkevich Yuriy 30.12.2010, 22:47

Цитата(DEADHUNT @ 31.12.2010, 0:20) *
какая страница?
сейчас я не скажу, но у трёх разных авторов, в том числе и Страустопа был пример по поводу двух платформ.
Цитата(AD @ 29.12.2010, 17:37) *
Например, если байт будет не 8 бит, а меньше, то уже такое определение не подходит.
да, как раз в примере речь и шла о "слове" (не в терминах Интел/мелкософт) - т.е. ширина шины данных.


Автор: Алексей1153 31.12.2010, 17:39

Цитата(panter_dsd @ 30.12.2010, 1:30) *
Костыльный костыль. ИМХО, лучше сделать typedef int8 (16, 32, etc)

можно. Когда такие типы есть и за ними строго закреплён стандарт. На что надеяться нельзя, впрочем )

Автор: Iron Bug 1.1.2011, 15:16

во многих компиляторах определены типы int8 (16,32...). как правило, тип int равен ширине шины. но бывает (при стандарте x86-64 берётся тип основных регистров, используемых конкретной осью). однако, среди всего многообразия компиляторов я ещё не видела, чтобы short был бы не двухбайтовый. исключения - компиляторы для DSP процессоров, там просто все типы данных - long, ибо процессор так устроен, что не может работать с меньшей длиной, поэтому там типы - чистая формальность, там даже char длиной в два слова. вот там нужно самому следить, чтобы сравнения были корректны и там для этой цели реализованы специальные функции приведения для корректного отсечения мусора при сравнении данных, а длина всегда 4. но в остальных случаях компилятор будет проверять длину данных. сколько видела компилеров, для всех short - это 2 байта. ну а представление байтов зависит от проца.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)