Форум программистов, компьютерный форум CyberForum.ru

Зачем нужны разнообразные целые типы переменных? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
06.09.2012, 13:32     Зачем нужны разнообразные целые типы переменных? #1
1) Вот зачем нам нужен тип short если есть тип long? Как я понял из учебника, если моя переменная будет содержать не слишком большое целое число, то целесообразно использовать short, т.к. он 2 байта (long - 4 байта) и поэтому меньше памяти тратится и соответственно программа работает быстрее. Ну ладно, пусть так (если я, конечно, правильно всё понял).

2) Есть ещё слово unsigned, но тогда переменная не может быть отрицательной. Вот тут на самом деле не ясно, зачем это надо? unsigned long и signed long занимают одинаковый объём памяти.

3) Теперь главное. До того, как я прочитал эту всю ерунду, я всегда писал просто int и никаких проблем. Тут решил писать более разнообразно и везде заменил int на все эти unsigned long int, signed short int и т.п.. И в итоге программа стала выдавать неправильный результат! Пришлось всё поменять как было (везде просто int). Вот интересно стало: кто-нибудь пользуется всем этим разнообразием целых типов? И если да, то зачем? У меня это почему-то привело к ошибкам. Хотя я так и не понял почему. Тем более, что как я понимаю int и signed long int это вообще одно и то же.

4) И ещё: для функции main пишут что надо ставить тип возвращаемого значения int, т.е.
C++
1
int main()
а не:
C++
1
signed long int main() // или что-то наподобие
Так что получается, разработчики сами не особо то пользуются всей этой кучей.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2012, 13:32     Зачем нужны разнообразные целые типы переменных?
Посмотрите здесь:

C++ Зачем нужны операторы << и >>
Зачем нужны макросы? C++
Целые типы данных C++
C++ Зачем нужны сортировки
C++ Зачем нужны деревья?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
co6ak
Кошковед
 Аватар для co6ak
403 / 496 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
06.09.2012, 13:35     Зачем нужны разнообразные целые типы переменных? #2
еще есть unsigned

типо unsigned short int = 321;

все дело в занимаемой ими памяти. если тебе нужно число 60000, но западло вводить long, то можно использовать unsigned int;
2 байта экономии

ты посмотри диапазон возможных значений. вопросы должны отпасть
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.09.2012, 13:36     Зачем нужны разнообразные целые типы переменных? #3
почитай двоичное представление чисел.
как пример - для знаковых и беззнаковых операции сдвига будут работать по-разному.
операции сравнения - тоже.
если тебе с небольшими числами, причем по одному работать нужно - используй int и не парься. а если в структуру паковать, а этими структурами еще и контейнеры будут набиваться, или если это передавать куда-то нужно, уже начинаешь считать.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
06.09.2012, 13:39     Зачем нужны разнообразные целые типы переменных? #4
1. скорее, просто экономия памяти. грандиозных результатов в скорости за счет изменения int на short особенно-то не получить
2. диапазон значений меняется (для signed / unsigned)
3. надо смотреть код, что у вас там не работает. беззнаковые используют, например, там, где отрицательных чисел быть не должно (размер массива)
4. есть и другие функции, где это актуально
Hi4ko
74 / 74 / 4
Регистрация: 21.10.2010
Сообщений: 376
06.09.2012, 13:40     Зачем нужны разнообразные целые типы переменных? #5
1) Экономия памяти.
2) Изучал хранение целых чисел в компьютере? Если число беззнаковое, то граница значений переменной увеличивается по модулю в два раза.(т.к. в знаковом 1 бит идёт на хранение знака)
3) Кинь приложение и объясни, что оно делает.
4) Прототипы только такие:
C++
1
2
3
4
5
int main(void);
int main();
 
int main(int argc, char **argv);
int main(int argc, char *argv[]);
Добавлено через 57 секунд
Цитата Сообщение от I.M. Посмотреть сообщение
1. скорее, просто экономия памяти. грандиозных результатов в скорости за счет изменения int на short особенно-то не получить
2. диапазон значений меняется (для signed / unsigned)
3. надо смотреть код, что у вас там не работает. беззнаковые используют, например, там, где отрицательных чисел быть не должно (размер массива)
4. есть и другие функции, где это актуально

Не по теме:

пока писал, 4 поста тут запилили

Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
06.09.2012, 13:45     Зачем нужны разнообразные целые типы переменных? #6
4) Прототипы только такие:
Правда?:-)
C++
1
int main( int argc, char** argv, char** envp );
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.09.2012, 13:45     Зачем нужны разнообразные целые типы переменных? #7
Цитата Сообщение от I.M. Посмотреть сообщение
1. скорее, просто экономия памяти. грандиозных результатов в скорости за счет изменения int на short особенно-то не получить
почему же? в регистр одно число помещается, или два - есть разница?
Hi4ko
74 / 74 / 4
Регистрация: 21.10.2010
Сообщений: 376
06.09.2012, 13:46     Зачем нужны разнообразные целые типы переменных? #8
Цитата Сообщение от Герц Посмотреть сообщение
Правда?:-)
C++
1
int main( int argc, char** argv, char** envp );

Не по теме:

мой фейл . И он есть)

Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
06.09.2012, 13:49     Зачем нужны разнообразные целые типы переменных? #9
почему же? в регистр одно число помещается, или два - есть разница?
У современных компьютеров (не микроконтроллеров) любой регистр вместит в себя 4 байта, а у 64-битных и все 8, так что на помещении аргументов в регистры не сэкономишь, на кэш-памяти, думаю, тоже.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.09.2012, 13:50     Зачем нужны разнообразные целые типы переменных? #10
Цитата Сообщение от Герц Посмотреть сообщение
У современных компьютеров (не микроконтроллеров) любой регистр вместит в себя 4 байта, а у 64-битных и все 8, так что на помещении аргументов в регистры не сэкономишь, на кэш-памяти, думаю, тоже.
на количестве циклов обращения к памяти. причем во столько раз, во сколько короче твои переменые.
Bomg
2 / 2 / 0
Регистрация: 04.10.2009
Сообщений: 51
06.09.2012, 13:54     Зачем нужны разнообразные целые типы переменных? #11
Цитата Сообщение от Alex Z Посмотреть сообщение
4) И ещё: для функции main пишут что надо ставить тип возвращаемого значения int, т.е.
C++
1
int main()
а не:
C++
1
signed long int main() // или что-то наподобие
Так что получается, разработчики сами не особо то пользуются всей этой кучей.
Как я помню из учебника, функция main - главная функция с нее начинается вся программа и возвращает она всегда int значение и никакое более. Могу ошибаться.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
06.09.2012, 13:56     Зачем нужны разнообразные целые типы переменных? #12
на количестве циклов обращения к памяти. причем во столько раз, во сколько короче твои переменые.
И то не всегда, допустим есть у тебя структура
C++
1
2
3
4
5
struct
{
    int index;
    int size;
};
И ты знаешь, что index вполне себе помещается в short, но из-за выравнивания ты не получишь никакого бонуса, объявив её как short index; int size;, а если принудительно задать упаковку по границе 1 байта, то еще и в скорости проиграешь.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.09.2012, 13:58     Зачем нужны разнообразные целые типы переменных? #13
TS, догоняешь хоть что-нибудь, или тебя уже не здесь?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.09.2012, 14:22     Зачем нужны разнообразные целые типы переменных? #14
Цитата Сообщение от Герц Посмотреть сообщение
Правда?:-)
C++
1
int main( int argc, char** argv, char** envp );
Мы говорим о стандартном С++?
Тогда цитата из драфта n3337 (в стандарте С++03 аналогично)
An implementation shall not predefine the main function. This function shall not be overloaded. It shall
have a return type of type int, but otherwise its type is implementation-defined. All implementations shall
allow both of the following definitions of main:
C++
1
2
int main() { /* ...
*/ }
and
C++
1
2
int main(int argc, char* argv[]) { /* ...
*/ }
Как видно ограничений на другие - нету, но это уже дело реализации.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
06.09.2012, 16:26     Зачем нужны разнообразные целые типы переменных? #15
Тогда извиняюсь :-)
Байт
 Аватар для Байт
13993 / 8824 / 1231
Регистрация: 24.12.2010
Сообщений: 15,990
06.09.2012, 17:26     Зачем нужны разнообразные целые типы переменных? #16
Представьте, что нужно хранить ба-а-альшой массив целых в двоичном файле. И вы знаете, что сами эти целые не велики. Вот тут как раз задумаешься, какой тип использовать, long, int, short или даже unsigned char.
Но беда в том, что определены эти типы, как-то эээ.., неустойчиво. int то 16 битов, то 32. long то 32, то 64. И никто не гарантирует что где-то он не будет 128. Поэтому приходится вводить все эти int16, int32 и прочее. Причем они вводятся по косвенным признакам...
Уже не раз напарывался на то, что база данных (или большая таблица) сделанная в одном месте, совершенно не работает в другом.
ИМХО, отсутствие типов int16, int32 и т.п. в определении языка Си - одна из редких ошибок разработчиков. Недоучли, что для работы с двоичными файлами надо иметь возможность точно определять, сколько памяти занимают данные...
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
06.09.2012, 17:32     Зачем нужны разнообразные целые типы переменных? #17
Байт, работают же как-то =) Есть типы uint32_t итд, например.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
06.09.2012, 17:32     Зачем нужны разнообразные целые типы переменных? #18
Цитата Сообщение от novi4ok Посмотреть сообщение
в регистр одно число помещается, или два - есть разница?
Почитай про то, как числа в регистр помещаются. Нельзя два 16 битных числа записать наместо одного 32 битного, так что в этом смысле никакого выигрыша. А вот два 8битных вместо одного 16 битного записать можно. Но с 32 битными всё равно быстрее работать будет, так что...

Цитата Сообщение от Alex Z Посмотреть сообщение
И если да, то зачем?
Если по логике вещей число должно быть только положительным, то оно должно быть положительным. Если число превышает 31 бит, то в знаковое 32 битное ты его записать не сможешь.

Цитата Сообщение от Alex Z Посмотреть сообщение
везде заменил int на все эти unsigned long int, signed short int и т.п..
А нужно было заменять только там, где нужно.
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
07.09.2012, 12:57  [ТС]     Зачем нужны разнообразные целые типы переменных? #19
Цитата Сообщение от I.M. Посмотреть сообщение
3. надо смотреть код, что у вас там не работает. беззнаковые используют, например, там, где отрицательных чисел быть не должно (размер массива)
Вот у меня и было как раз число, которое есть размер массива. Исправил int на unsigned int и программа начала выдавать неправильный ответ. Я и сам не ожидал такого.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2012, 13:25     Зачем нужны разнообразные целые типы переменных?
Еще ссылки по теме:

C++ зачем нужны итераторы?
C++ Зачем нужны указатели?
C++ Целые типы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
07.09.2012, 13:25     Зачем нужны разнообразные целые типы переменных? #20
Цитата Сообщение от Alex Z Посмотреть сообщение
Вот у меня и было как раз число, которое есть размер массива. Исправил int на unsigned int и программа начала выдавать неправильный ответ.
позвольте не поверить
есть типы
unsugned int
signed int
int
последний может принимать значение и первого и второго зависит от настроек(чаще всего signed)
теперь разница между unsugned и signed как уже было отмечено вся разница и в интерпретации старшего байта
или это знаковый (signed) или старший бит числа (unsugned)

например число 0xFFFFFFFF
это -1 (signed)
и 4294967295 (unsugned)
пример
C++
1
2
int a=0xFFFFFFFF;
printf("%x  %d  %d", a,(unsigned int)a,(signed int)a);
то же и относится к char

насчет длинны(конкретно размер в байтах никто не обещал)
говорится что short должен быть не больше int а int не больше long

и напоследок
вот такой цикл никогда не закончится
C++
1
for(unsigned  int i=5;i<0;i--)
поскольку после 0 i будет равна 4294967295
Yandex
Объявления
07.09.2012, 13:25     Зачем нужны разнообразные целые типы переменных?
Ответ Создать тему
Опции темы

Текущее время: 06:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru