Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/41: Рейтинг темы: голосов - 41, средняя оценка - 4.80
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
1

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2012, 13:32
Ответы с готовыми решениями:

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

Целые типы данных
Целые типы данных Вычислить значения выражения 20 trunc(20.4) trunc(320.64) round(243.6)...

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

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

52
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.09.2012, 13:32 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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
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
2554 / 1319 / 178
Регистрация: 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
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
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
Заблокирован
23.08.2015, 10:47 26
я тоже задаюсь аналогичными вопросами и никак не могу понять, в каком случае лучше использовать тот или иной тип. думаю, что пока у меня нет в этом необходимости, то буду писать просто int. если кто-нибудь знает простую методику запонимания какой переменной какой тип лучше, кроме опыта и зазубривания, то было бы неплохо её выложить. я думаю многие новички оценят
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.08.2015, 11:14 27
Цитата Сообщение от rep plz Посмотреть сообщение
простую методику запонимания какой переменной какой тип лучше
Зависит от обстоятельств и выбора критерия, по которому идет учет что лучше.
Например, в каких-то случаях лучше скорость, а в других - кол-во использованной памяти.
Поэтому однозначной рекомендации для всех быть не может.
0
Заблокирован
23.08.2015, 11:23 28
Tulosba, вы имеет в виду, что такой методики нет? я говорю про методику запоминания преимуществ или недостатков типа переменных, а не их надобности. например, помните как запоминали в школе падежи?
Иван
Родил
Девченку
Велел
Тащить
Пелёнку
или пример именно из программирования: если число д.б. с запятой, то автоматом в памяти всплывает float. получается такая простая ассоциативность запятая значит float. и если есть какая-либо ассоциативность на другие типы, то я был бы рад) если нет, то придётся зубрить
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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
Респект C++
23 / 33 / 14
Регистрация: 11.06.2015
Сообщений: 384
23.08.2015, 11:41 30
Мой вам совет. Используйте double. С ним вообще никаких проблем. Он и слишком большие числа считает, и десятичные, шестнадцатиричные, и целые да и вообще самый удобный. А про unsigned - конечно будет неправильный ответ. Он даже переводится как "беззнаковый".
1
Заблокирован
23.08.2015, 11:52 31
FCommander, double пишется как double или double int?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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.... a62d886d67

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

Главное помнить, что серебряной пули нет. Нет одного универсального правила на все случаи жизни. Могут быть только рекомендации, например:
- использовать size_t для обозначения размеров, это беззнаковый целый тип.
- использовать ptrdiff_t для разницы указателей, это знаковый целый тип.
Кстати, прочитать про это можно тут.
4
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
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.
для чего все это нужно?
язык с++ возник не вчера.
он возник во времена, когда ещё не было никаких "современных процессоров".

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

за счет модификаторов и промоушена
становится возможным реализовать оптимизации вычислений
на конкретной платформе.
2
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
23.08.2015, 17:51 36
Цитата Сообщение от ValeryS Посмотреть сообщение
есть типы
unsugned int
signed int
int
последний может принимать значение и первого и второго зависит от настроек
Это вы сами придумали или прочитали где-то?
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.08.2015, 18:14 37
Цитата Сообщение от Mr.X Посмотреть сообщение
Это вы сами придумали или прочитали где-то?
смею предположить, что господин ValeryS прочитал это здесь:
http://en.cppreference.com/w/cpp/language/types
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
23.08.2015, 18:19 38
Цитата Сообщение от Mr.X Посмотреть сообщение
Это вы сами придумали или прочитали где-то?
это насчет
Цитата Сообщение от ValeryS Посмотреть сообщение
int
последний может принимать значение и первого и второго зависит от настроек(чаще всего signed)
во первых, я это писал три года назад, и меня тут же поправили
Цитата Сообщение от accept Посмотреть сообщение
signed введён из-за char, который может иметь знак, а может не иметь знака
да, согласен,спутал с char-ом
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.08.2015, 18:27 39
Цитата Сообщение от ValeryS Посмотреть сообщение
во первых, я это писал три года назад, и меня тут же поправили
это при том, что ваш тезис - корректен.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
23.08.2015, 18:30 40
Цитата Сообщение от ValeryS Посмотреть сообщение
я это писал три года назад
Ой, пардон, не заметил.
0
23.08.2015, 18:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.08.2015, 18:30
Помогаю со студенческими работами здесь

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

Не понимаю зачем нужен конструктор и типы методов
Объясните пожалуйста на пальцах зачем нужен Constructor и типы методов. В учебнике лишь написано,...

Зачем нужны транзакции?
Поясните чайнику! Если использовать транзакции, команды в теле транзакции такие же как обычно, или...

Зачем нужны исключения
Пожалуйста можете привести пример, когда они действительно нужны? На лекции были примеры &quot;деление...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru