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

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

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

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

06.09.2012, 13:32. Просмотров 2032. Ответов 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() // или что-то наподобие
Так что получается, разработчики сами не особо то пользуются всей этой кучей.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2012, 13:32     Зачем нужны разнообразные целые типы переменных?
Посмотрите здесь:
C++ Целые типы
Целые типы данных C++
C++ Зачем нужны указатели?
C++ Зачем нужны деревья?
C++ Зачем нужны сортировки
C++ Зачем нужны классы?
C++ Зачем нужны итераторы?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rep plz
Заблокирован
23.08.2015, 11:52     Зачем нужны разнообразные целые типы переменных? #31
FCommander, double пишется как double или double int?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
23.08.2015, 12:08     Зачем нужны разнообразные целые типы переменных? #34
Цитата Сообщение от rep plz Посмотреть сообщение
то придётся зубрить
Не надо ничего зубрить. Нужно больше практики и понимание придет само без всякой зубрежки.
Если сейчас выводить правила в стиле "если - то", то их получится гораздо больше, чем типов в языке, потому что у каждого типа множество различных применений в зависимости от ситуации.
Вот простой пример:
C++
1
char buf[100];
Что это, строка? Или буфер для чтения из сети? Или, может быть, мы сюда будем сериализовать данные для записи в файл? Или здесь будет размещаться объект посредством placement new?

Главное помнить, что серебряной пули нет. Нет одного универсального правила на все случаи жизни. Могут быть только рекомендации, например:
- использовать size_t для обозначения размеров, это беззнаковый целый тип.
- использовать ptrdiff_t для разницы указателей, это знаковый целый тип.
Кстати, прочитать про это можно тут.
hoggy
6437 / 2655 / 460
Регистрация: 15.11.2014
Сообщений: 5,844
Завершенные тесты: 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
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
23.08.2015, 17:51     Зачем нужны разнообразные целые типы переменных? #36
Цитата Сообщение от ValeryS Посмотреть сообщение
есть типы
unsugned int
signed int
int
последний может принимать значение и первого и второго зависит от настроек
Это вы сами придумали или прочитали где-то?
hoggy
6437 / 2655 / 460
Регистрация: 15.11.2014
Сообщений: 5,844
Завершенные тесты: 1
23.08.2015, 18:14     Зачем нужны разнообразные целые типы переменных? #37
Цитата Сообщение от Mr.X Посмотреть сообщение
Это вы сами придумали или прочитали где-то?
смею предположить, что господин ValeryS прочитал это здесь:
http://en.cppreference.com/w/cpp/language/types
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
23.08.2015, 18:19     Зачем нужны разнообразные целые типы переменных? #38
Цитата Сообщение от Mr.X Посмотреть сообщение
Это вы сами придумали или прочитали где-то?
это насчет
Цитата Сообщение от ValeryS Посмотреть сообщение
int
последний может принимать значение и первого и второго зависит от настроек(чаще всего signed)
во первых, я это писал три года назад, и меня тут же поправили
Цитата Сообщение от accept Посмотреть сообщение
signed введён из-за char, который может иметь знак, а может не иметь знака
да, согласен,спутал с char-ом
hoggy
6437 / 2655 / 460
Регистрация: 15.11.2014
Сообщений: 5,844
Завершенные тесты: 1
23.08.2015, 18:27     Зачем нужны разнообразные целые типы переменных? #39
Цитата Сообщение от ValeryS Посмотреть сообщение
во первых, я это писал три года назад, и меня тут же поправили
это при том, что ваш тезис - корректен.
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
23.08.2015, 18:30     Зачем нужны разнообразные целые типы переменных? #40
Цитата Сообщение от ValeryS Посмотреть сообщение
я это писал три года назад
Ой, пардон, не заметил.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
23.08.2015, 18:44     Зачем нужны разнообразные целые типы переменных? #41
Цитата Сообщение от hoggy Посмотреть сообщение
это при том, что ваш тезис - корректен.
не совсем
int это и есть signed int
в отличии от char, который в зависимости от настроек будет или unsigned char, или signed char
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
23.08.2015, 18:45     Зачем нужны разнообразные целые типы переменных? #42
Цитата Сообщение от hoggy Посмотреть сообщение
это при том, что ваш тезис - корректен
В смысле?
hoggy
6437 / 2655 / 460
Регистрация: 15.11.2014
Сообщений: 5,844
Завершенные тесты: 1
23.08.2015, 22:18     Зачем нужны разнообразные целые типы переменных? #43
Цитата Сообщение от ValeryS Посмотреть сообщение
не совсем
int это и есть signed int
ну да. именно.

Цитата Сообщение от Mr.X Посмотреть сообщение
В смысле?
всмысле все эти short/long и компания - это на самом деле модификаторы одного и того же int.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.08.2015, 23:16     Зачем нужны разнообразные целые типы переменных? #44
Цитата Сообщение от ValeryS Посмотреть сообщение
char, который в зависимости от настроек будет или unsigned char, или signed char
Всё таки char/unsigned char/signed char это 3(три, Карл!) разных типа.
3.9.1/1: Plain char, signed char, and unsigned char are three distinct types.
Кликните здесь для просмотра всего текста
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
25
#include <iostream>
using namespace std;
 
void f(char){ 
    cout << "char\n";
}
 
void f(unsigned char){ 
    cout << "uchar\n";
} 
 
void f(signed char){ 
    cout << "schar\n";
}
 
int main() {
 
    char c = '0';
    unsigned char uc = c;
    signed char sc = c;
 
    f(c); 
    f(uc); 
    f(sc); 
}
http://coliru.stacked-crooked.com/a/98e9d64a353ecb83

А вот как значение char (без явного указания знаковости) будет интерпретировано в виде числа (т.е. по сути, какой будет диапазон значений), зависит от реализации (может быть такой же как у signed char, а может и как у unsigned char).
Например, следующий код:
C++
1
2
3
4
5
6
#include <iostream>
 
int main() {
    char c = -100;
    std::cout << static_cast<int>(c) << std::endl;
}
может вывести как "-100", так и "156" в зависимости от используемого компилятора или даже его ключей.
В частности в gcc/clang можно форсировать интерпретацию диапазона значений char ключами: -funsigned-char, -fsigned-char.
Цитата Сообщение от hoggy Посмотреть сообщение
все эти short/long и компания - это на самом деле модификаторы одного и того же int.
Строго говоря, это не соответствует действительности. К тому же signed и unsigned char'ы в списке целочисленных типов такие же полноправные участники, как и остальные int'ы:
3.9.1 Fundamental types
p2: There are five standard signed integer types : “signed char”, “short int”, “int”, “long int”, and “long long int” ...
The standard and extended signed integer types are collectively called signed integer types.
p3: For each of the standard signed integer types, there exists a corresponding (but different) standard unsigned integer type: “unsigned char”, “unsigned short int”, “unsigned int”, “unsigned long int”, and “unsigned long long int” ...
The standard and extended unsigned integer types are collectively called unsigned integer types.
Т.о. int'ы всё же разные (а некоторые даже и не int'ы), но в общем они называются "целочисленными типами" (integer types).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2015, 18:07     Зачем нужны разнообразные целые типы переменных?
Еще ссылки по теме:
Зачем нужны указатели C++
Зачем нужны исключения? C++
C++ Зачем нужны операторы << и >>
Зачем нужны макросы? C++
Объясните зачем нужны конструкторы C++

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

Или воспользуйтесь поиском по форуму:
hoggy
6437 / 2655 / 460
Регистрация: 15.11.2014
Сообщений: 5,844
Завершенные тесты: 1
24.08.2015, 18:07     Зачем нужны разнообразные целые типы переменных? #45
Цитата Сообщение от Tulosba Посмотреть сообщение
Строго говоря, это не соответствует действительности.
см "модификаторы фундаментальных типов"
http://en.cppreference.com/w/cpp/language/types
Yandex
Объявления
24.08.2015, 18:07     Зачем нужны разнообразные целые типы переменных?
Ответ Создать тему
Опции темы

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