Форум программистов, компьютерный форум 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++ Зачем нужны деревья?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 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, я для пущей определенности
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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 и не греть голову.
soon
 Аватар для soon
2536 / 1301 / 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 Посмотреть сообщение
По идее, это же разные типы. Или тут компиллятор сам их приводит к одному (к какому?).
К лонгу.
accept
4838 / 3237 / 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 значений состоят из положительных и нуля (а сам бит участвует в образовании величины)
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
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 Посмотреть сообщение
старшего бита
согласен
конечно бита просто описался
rep plz
Заблокирован
23.08.2015, 10:47     Зачем нужны разнообразные целые типы переменных? #26
я тоже задаюсь аналогичными вопросами и никак не могу понять, в каком случае лучше использовать тот или иной тип. думаю, что пока у меня нет в этом необходимости, то буду писать просто int. если кто-нибудь знает простую методику запонимания какой переменной какой тип лучше, кроме опыта и зазубривания, то было бы неплохо её выложить. я думаю многие новички оценят
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.08.2015, 11:14     Зачем нужны разнообразные целые типы переменных? #27
Цитата Сообщение от rep plz Посмотреть сообщение
простую методику запонимания какой переменной какой тип лучше
Зависит от обстоятельств и выбора критерия, по которому идет учет что лучше.
Например, в каких-то случаях лучше скорость, а в других - кол-во использованной памяти.
Поэтому однозначной рекомендации для всех быть не может.
rep plz
Заблокирован
23.08.2015, 11:23     Зачем нужны разнообразные целые типы переменных? #28
Tulosba, вы имеет в виду, что такой методики нет? я говорю про методику запоминания преимуществ или недостатков типа переменных, а не их надобности. например, помните как запоминали в школе падежи?
Иван
Родил
Девченку
Велел
Тащить
Пелёнку
или пример именно из программирования: если число д.б. с запятой, то автоматом в памяти всплывает float. получается такая простая ассоциативность запятая значит float. и если есть какая-либо ассоциативность на другие типы, то я был бы рад) если нет, то придётся зубрить
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.08.2015, 11:33     Зачем нужны разнообразные целые типы переменных? #29
Цитата Сообщение от rep plz Посмотреть сообщение
я говорю про методику запоминания преимуществ или недостатков типа переменных
Если речь о целых типах (как названа текущая тема), то запоминать особо и нечего. Кроме того, что префикс signed или unsigned не влияет на размер в байтах, и что в любом компиляторе должно согласно Стандарта выполняться следующее неравенство:
C++
1
1 = sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long).
FCommander
Респект C++
 Аватар для FCommander
22 / 32 / 5
Регистрация: 11.06.2015
Сообщений: 384
23.08.2015, 11:41     Зачем нужны разнообразные целые типы переменных? #30
Мой вам совет. Используйте double. С ним вообще никаких проблем. Он и слишком большие числа считает, и десятичные, шестнадцатиричные, и целые да и вообще самый удобный. А про unsigned - конечно будет неправильный ответ. Он даже переводится как "беззнаковый".
rep plz
Заблокирован
23.08.2015, 11:52     Зачем нужны разнообразные целые типы переменных? #31
FCommander, double пишется как double или double int?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.08.2015, 11:53     Зачем нужны разнообразные целые типы переменных? #32
Цитата Сообщение от FCommander Посмотреть сообщение
Мой вам совет. Используйте double.
Плохой совет. Вот пример для демонстрации того, что так делать нельзя:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
template<class T>
void test() {
    T v1 = 12345678901234567890ULL; // значения v1 
    T v2 = 12345678901234567891ULL; // и v2 отличаются на 1
    std::cout << ((v1==v2) ? "" : "not") << "equal\n";
}
 
int main()  {
    test<double>(); // однако сравнение их как double считает их одинаковыми.
    test<unsigned long long>(); // видим, что разные.
}
http://coliru.stacked-crooked.com/a/fc9731a62d886d67

Добавлено через 1 минуту
Цитата Сообщение от rep plz Посмотреть сообщение
или double int?
Такого типа нет. Всё же рекомендую заглянуть хотя бы в учебник по языку, дабы уяснить базовые моменты, прежде чем обращаться за помощью на форум.
rep plz
Заблокирован
23.08.2015, 12:03     Зачем нужны разнообразные целые типы переменных? #33
Цитата Сообщение от Tulosba Посмотреть сообщение
Такого типа нет. Всё же рекомендую заглянуть хотя бы в учебник по языку, дабы уяснить базовые моменты, прежде чем обращаться за помощью на форум.
на самом деле я осознанно пропускаю материалы про типы переменных в учебнике, потому что и без них моск морщится и приходится уделять большее время второстепенным вопросам, которые, возможно, мне понадобятся не раньше чем через год... и именно осознанный пропуск данной информации и послужил основой для поднятия этой темы. просто с вашим опытом, это кажется ошибкой или некомпетентностью, а для меня, как новичка, это пока не столь важно, и я стараюсь уделить больше внимания тому материалу, который явно влияет на результат выполнения программы, до тех пор, пока меня устраивает int. но тем не менее, спасибо вам за совет
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
23.08.2015, 12:08     Зачем нужны разнообразные целые типы переменных? #34
Цитата Сообщение от rep plz Посмотреть сообщение
то придётся зубрить
Не надо ничего зубрить. Нужно больше практики и понимание придет само без всякой зубрежки.
Если сейчас выводить правила в стиле "если - то", то их получится гораздо больше, чем типов в языке, потому что у каждого типа множество различных применений в зависимости от ситуации.
Вот простой пример:
C++
1
char buf[100];
Что это, строка? Или буфер для чтения из сети? Или, может быть, мы сюда будем сериализовать данные для записи в файл? Или здесь будет размещаться объект посредством placement new?

Главное помнить, что серебряной пули нет. Нет одного универсального правила на все случаи жизни. Могут быть только рекомендации, например:
- использовать size_t для обозначения размеров, это беззнаковый целый тип.
- использовать ptrdiff_t для разницы указателей, это знаковый целый тип.
Кстати, прочитать про это можно тут.
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
23.08.2015, 16:07     Зачем нужны разнообразные целые типы переменных? #35
Цитата Сообщение от Alex Z Посмотреть сообщение
Вот у меня и было как раз число, которое есть размер массива. Исправил int на unsigned int и программа начала выдавать неправильный ответ. Я и сам не ожидал такого.
очевидно жеж, что это - криворукий код.

стандарт предусматривает тип данных size_t,
специально предназначенный для хранения размеров типов,
и как следствие - индексов массивов.

в большинстве реализаций size_t и unsigned - одно и тоже.

а вот использовать для таких целей int - некорректно.

Цитата Сообщение от Alex Z Посмотреть сообщение
Вот зачем нам нужен тип short если есть тип long?
формально, это - не типы данных.
это модификаторы для фундаментального типа int.

есть фундаментальный тип int,
и кучка модификаторов к нему, такие как short, или long.

однако, на практике инты с различными модификаторами опознаются как разные типы.
что и порождает иллюзию, что это принципиально различные типы.

впрочем если их рассматривать, как принципиально разные типы,
то вы ничего страшного не упустите.

сами модификаторы влияют лишь на размер фундаментального типа.

что однако, попадает под правило "промоушена типов".

поэтому, можно сказать,
что модификаторы типов влияют так же и на промоушен типов.


"промоушен типов" - если вкратце, оптимизация вычислений по разрядной сетке машины.

пример:

http://rextester.com/NTVU87023

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
 
int main()
{
    std::cout << "Hello, world!\n";
    
    typedef decltype(short() + short()) sum;
    
    if( is_same<sum, int>::value == 1 )
        cout<<"decltype( short()+short() ) is int"<<endl;
    
    short v1 = 0;
    short v2 = 0;
    
    if( is_same<decltype(v1 +v2), int>::value == 1 )
        cout<<"decltype( v1+v2 ) is int"<<endl;
    
    auto v3 = v1+v2;
    
    if( is_same<decltype(v3), int>::value == 1 )
        cout<<"decltype( v3 ) is int"<<endl;
 
}
стандарт говорит об этом так:

4.5 Integral promotions [conv.prom]
1 A prvalue of an integer type other than bool, char16_t, char32_t, or wchar_t whose integer conversion
rank (4.13) is less than the rank of int can be converted to a prvalue of type int if int can represent all
the values of the source type; otherwise, the source prvalue can be converted to a prvalue of type unsigned
int.
для чего все это нужно?
язык с++ возник не вчера.
он возник во времена, когда ещё не было никаких "современных процессоров".

кроме того, в его основе заложена идея о "встраиваемости",
что неизбежно влечет за собой необходимость "адаптации" к самым различным условиям.
то есть, он должен максимально эффективно работать на самых разных платформах.

за счет модификаторов и промоушена
становится возможным реализовать оптимизации вычислений
на конкретной платформе.
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,669
23.08.2015, 17:51     Зачем нужны разнообразные целые типы переменных? #36
Цитата Сообщение от ValeryS Посмотреть сообщение
есть типы
unsugned int
signed int
int
последний может принимать значение и первого и второго зависит от настроек
Это вы сами придумали или прочитали где-то?
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
23.08.2015, 18:14     Зачем нужны разнообразные целые типы переменных? #37
Цитата Сообщение от Mr.X Посмотреть сообщение
Это вы сами придумали или прочитали где-то?
смею предположить, что господин ValeryS прочитал это здесь:
http://en.cppreference.com/w/cpp/language/types
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
23.08.2015, 18:19     Зачем нужны разнообразные целые типы переменных? #38
Цитата Сообщение от Mr.X Посмотреть сообщение
Это вы сами придумали или прочитали где-то?
это насчет
Цитата Сообщение от ValeryS Посмотреть сообщение
int
последний может принимать значение и первого и второго зависит от настроек(чаще всего signed)
во первых, я это писал три года назад, и меня тут же поправили
Цитата Сообщение от accept Посмотреть сообщение
signed введён из-за char, который может иметь знак, а может не иметь знака
да, согласен,спутал с char-ом
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
23.08.2015, 18:27     Зачем нужны разнообразные целые типы переменных? #39
Цитата Сообщение от ValeryS Посмотреть сообщение
во первых, я это писал три года назад, и меня тут же поправили
это при том, что ваш тезис - корректен.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2015, 18:30     Зачем нужны разнообразные целые типы переменных?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,669
23.08.2015, 18:30     Зачем нужны разнообразные целые типы переменных? #40
Цитата Сообщение от ValeryS Посмотреть сообщение
я это писал три года назад
Ой, пардон, не заметил.
Yandex
Объявления
23.08.2015, 18:30     Зачем нужны разнообразные целые типы переменных?
Ответ Создать тему
Опции темы

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