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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
#1

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

06.09.2012, 13:32. Просмотров 2085. Ответов 52
Метки нет (Все метки)

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() // или что-то наподобие
Так что получается, разработчики сами не особо то пользуются всей этой кучей.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2012, 13:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Зачем нужны разнообразные целые типы переменных? (C++):

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить? - C++
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...

Целые типы - C++
=-OЦелы типы данных (подробно). Операция "%", "/ "!

Целые типы данных - C++
Всем привет! Знаю что сейчас засмеют, но всё же. Вопрос: Если k является переменной типа int, то чему будет равна k после выполнения...

Зачем нужны исключения? - C++
Добрый вечер, прочитал статью об исключениях, не очень понимаю, почему бы не заменить их просто оператором if? Вот код с исключением: ...

Зачем нужны деревья? - C++
Изучил тему деревья (осуществлял втавки, удаление, обходы и т.д.). Теперь хочу разобраться, зачем они вообще нужны? В каких случаях надо...

Зачем нужны операторы << и >> - C++
В книжке Дейтлов есть код http://pic.ipicture.ru/uploads/091222/thumbs/q1TZw4n1JQ.jpg Вопрос в том, что там где написано, что числа...

52
Байт
Эксперт C
16132 / 10410 / 1549
Регистрация: 24.12.2010
Сообщений: 19,712
06.09.2012, 17:26 #16
Представьте, что нужно хранить ба-а-альшой массив целых в двоичном файле. И вы знаете, что сами эти целые не велики. Вот тут как раз задумаешься, какой тип использовать, long, int, short или даже unsigned char.
Но беда в том, что определены эти типы, как-то эээ.., неустойчиво. int то 16 битов, то 32. long то 32, то 64. И никто не гарантирует что где-то он не будет 128. Поэтому приходится вводить все эти int16, int32 и прочее. Причем они вводятся по косвенным признакам...
Уже не раз напарывался на то, что база данных (или большая таблица) сделанная в одном месте, совершенно не работает в другом.
ИМХО, отсутствие типов int16, int32 и т.п. в определении языка Си - одна из редких ошибок разработчиков. Недоучли, что для работы с двоичными файлами надо иметь возможность точно определять, сколько памяти занимают данные...
2
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
06.09.2012, 17:32 #17
Байт, работают же как-то =) Есть типы uint32_t итд, например.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 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 и т.п..
А нужно было заменять только там, где нужно.
0
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
07.09.2012, 12:57  [ТС] #19
Цитата Сообщение от I.M. Посмотреть сообщение
3. надо смотреть код, что у вас там не работает. беззнаковые используют, например, там, где отрицательных чисел быть не должно (размер массива)
Вот у меня и было как раз число, которое есть размер массива. Исправил int на unsigned int и программа начала выдавать неправильный ответ. Я и сам не ожидал такого.
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
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
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.09.2012, 13:32 #21
Цитата Сообщение от Alex Z Посмотреть сообщение
Вот у меня и было как раз число, которое есть размер массива. Исправил int на unsigned int и программа начала выдавать неправильный ответ. Я и сам не ожидал такого.
наверное, где-то сравнение выполняется. а результат его будет зависеть от типов.
C++
1
2
3
4
bool gt = (int) 5 > (int) -5;// true
gt = (unsigned int) 5 > (unsigned int) -5;// false
gt = (int) 5 > (unsigned int) -5;// false
gt = (unsigned int) 5 > (int) -5;// false
(int) - лишнее, такие числа по умолчанию int, я для пущей определенности
0
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
07.09.2012, 13:34  [ТС] #22
Цитата Сообщение от ValeryS Посмотреть сообщение
позвольте не поверить
есть типы
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
А если я делаю так:
C++
1
2
3
4
5
unsigned short int a = 3;
int b = 4;
signed long int c;
 
c = a + b;
По идее, это же разные типы. Или тут компиллятор сам их приводит к одному (к какому?). Или он приводит сами цифры (3 и 4), а буквы a, b и c останутся каждая своего типа? Я вот такую ситуацию тоже опасаюсь. Поэтому и подумал, может лучше пусть все будут int и не греть голову.
0
soon
2541 / 1306 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.09.2012, 13:38 #23
Цитата Сообщение от ValeryS Посмотреть сообщение
и напоследок
вот такой цикл никогда не закончится
C++
1
for(unsigned  int i=5;i<0;i--)
Разумеется. Потому, что никогда не начнется.

Добавлено через 2 минуты
Цитата Сообщение от Alex Z Посмотреть сообщение
По идее, это же разные типы. Или тут компиллятор сам их приводит к одному (к какому?).
К лонгу.
1
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.09.2012, 13:53 #24
Цитата Сообщение от ValeryS Посмотреть сообщение
есть типы
unsugned int
signed int
int
последний может принимать значение и первого и второго зависит от настроек(чаще всего signed)
int всегда имеет знак, он не может быть короче short и не может быть длиннее long
signed int равен int
signed введён из-за char, который может иметь знак, а может не иметь знака

Цитата Сообщение от ValeryS Посмотреть сообщение
теперь разница между unsugned и signed как уже было отмечено вся разница и в интерпретации старшего байта
старшего бита
если старший бит является знаковым битом, то он не может являться частью величины значения
например, 32-х битная переменная может вместить 2 ^ 32 разных значений
если старший бит - знаковый, то эти 2 ^ 32 значений состоят из положительных, отрицательных и нуля
если старший бит - беззнаковый, то эти 2 ^ 32 значений состоят из положительных и нуля (а сам бит участвует в образовании величины)
1
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
07.09.2012, 14:08 #25
Цитата Сообщение от ValeryS Посмотреть сообщение
вот такой цикл никогда не закончится
C++
1
for(unsigned int i=5;i<0;i--)
Цитата Сообщение от soon Посмотреть сообщение
Разумеется. Потому, что никогда не начнется.
да накосячил
хотел поправить но интернет умер
правильно читать так
C++
1
for(unsigned int i=5;i>=0;i--)
Цитата Сообщение от accept Посмотреть сообщение
старшего бита
согласен
конечно бита просто описался
0
rep plz
Заблокирован
23.08.2015, 10:47 #26
я тоже задаюсь аналогичными вопросами и никак не могу понять, в каком случае лучше использовать тот или иной тип. думаю, что пока у меня нет в этом необходимости, то буду писать просто int. если кто-нибудь знает простую методику запонимания какой переменной какой тип лучше, кроме опыта и зазубривания, то было бы неплохо её выложить. я думаю многие новички оценят
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.08.2015, 11:14 #27
Цитата Сообщение от rep plz Посмотреть сообщение
простую методику запонимания какой переменной какой тип лучше
Зависит от обстоятельств и выбора критерия, по которому идет учет что лучше.
Например, в каких-то случаях лучше скорость, а в других - кол-во использованной памяти.
Поэтому однозначной рекомендации для всех быть не может.
0
rep plz
Заблокирован
23.08.2015, 11:23 #28
Tulosba, вы имеет в виду, что такой методики нет? я говорю про методику запоминания преимуществ или недостатков типа переменных, а не их надобности. например, помните как запоминали в школе падежи?
Иван
Родил
Девченку
Велел
Тащить
Пелёнку
или пример именно из программирования: если число д.б. с запятой, то автоматом в памяти всплывает float. получается такая простая ассоциативность запятая значит float. и если есть какая-либо ассоциативность на другие типы, то я был бы рад) если нет, то придётся зубрить
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.08.2015, 11:33 #29
Цитата Сообщение от rep plz Посмотреть сообщение
я говорю про методику запоминания преимуществ или недостатков типа переменных
Если речь о целых типах (как названа текущая тема), то запоминать особо и нечего. Кроме того, что префикс signed или unsigned не влияет на размер в байтах, и что в любом компиляторе должно согласно Стандарта выполняться следующее неравенство:
C++
1
1 = sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long).
0
FCommander
Респект C++
22 / 32 / 5
Регистрация: 11.06.2015
Сообщений: 384
23.08.2015, 11:41 #30
Мой вам совет. Используйте double. С ним вообще никаких проблем. Он и слишком большие числа считает, и десятичные, шестнадцатиричные, и целые да и вообще самый удобный. А про unsigned - конечно будет неправильный ответ. Он даже переводится как "беззнаковый".
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2015, 11:41
Привет! Вот еще темы с ответами:

Зачем нужны сортировки - C++
Скажите пожалуйста, зачем при подготовке к олимпиаде по программированию, нужно учить алгоритмы: Быстрая сортировка, сортировка пузырьком и...

Зачем нужны итераторы? - C++
Практическое использование мне понятно - с их помощью обходят контейнеры и т.д и т.п.Но почему не реализовать нужные методы,перегрузить...

Зачем нужны указатели - C++
Не могу понять синтаксис указателей. Понял, что это работа с адресами, что оператор &amp; это адрес. А вот * как я понял, это объявление...

Зачем нужны классы? - C++
Изучаю СИ++ после изучения СИ. Не пойму какой смысл в классах. То что они делают можно реализовать с помощью функций, структур и обычных...


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
23.08.2015, 11:41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru