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

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

06.09.2012, 13:32. Показов 9874. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.09.2012, 13:32
Ответы с готовыми решениями:

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

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

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

52
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.09.2012, 13:32
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от 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
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.09.2012, 13:38
Цитата Сообщение от ValeryS Посмотреть сообщение
и напоследок
вот такой цикл никогда не закончится
C++
1
for(unsigned  int i=5;i<0;i--)
Разумеется. Потому, что никогда не начнется.

Добавлено через 2 минуты
Цитата Сообщение от Alex Z Посмотреть сообщение
По идее, это же разные типы. Или тут компиллятор сам их приводит к одному (к какому?).
К лонгу.
1
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.09.2012, 13:53
Цитата Сообщение от 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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
07.09.2012, 14:08
Цитата Сообщение от 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
я тоже задаюсь аналогичными вопросами и никак не могу понять, в каком случае лучше использовать тот или иной тип. думаю, что пока у меня нет в этом необходимости, то буду писать просто int. если кто-нибудь знает простую методику запонимания какой переменной какой тип лучше, кроме опыта и зазубривания, то было бы неплохо её выложить. я думаю многие новички оценят
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.08.2015, 11:14
Цитата Сообщение от rep plz Посмотреть сообщение
простую методику запонимания какой переменной какой тип лучше
Зависит от обстоятельств и выбора критерия, по которому идет учет что лучше.
Например, в каких-то случаях лучше скорость, а в других - кол-во использованной памяти.
Поэтому однозначной рекомендации для всех быть не может.
0
Заблокирован
23.08.2015, 11:23
Tulosba, вы имеет в виду, что такой методики нет? я говорю про методику запоминания преимуществ или недостатков типа переменных, а не их надобности. например, помните как запоминали в школе падежи?
Иван
Родил
Девченку
Велел
Тащить
Пелёнку
или пример именно из программирования: если число д.б. с запятой, то автоматом в памяти всплывает float. получается такая простая ассоциативность запятая значит float. и если есть какая-либо ассоциативность на другие типы, то я был бы рад) если нет, то придётся зубрить
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.08.2015, 11:33
Цитата Сообщение от rep plz Посмотреть сообщение
я говорю про методику запоминания преимуществ или недостатков типа переменных
Если речь о целых типах (как названа текущая тема), то запоминать особо и нечего. Кроме того, что префикс signed или unsigned не влияет на размер в байтах, и что в любом компиляторе должно согласно Стандарта выполняться следующее неравенство:
C++
1
1 = sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long).
0
Респект C++
 Аватар для FCommander
23 / 33 / 14
Регистрация: 11.06.2015
Сообщений: 384
23.08.2015, 11:41
Мой вам совет. Используйте double. С ним вообще никаких проблем. Он и слишком большие числа считает, и десятичные, шестнадцатиричные, и целые да и вообще самый удобный. А про unsigned - конечно будет неправильный ответ. Он даже переводится как "беззнаковый".
1
Заблокирован
23.08.2015, 11:52
FCommander, double пишется как double или double int?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.08.2015, 11:53
Цитата Сообщение от 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
Цитата Сообщение от Tulosba Посмотреть сообщение
Такого типа нет. Всё же рекомендую заглянуть хотя бы в учебник по языку, дабы уяснить базовые моменты, прежде чем обращаться за помощью на форум.
на самом деле я осознанно пропускаю материалы про типы переменных в учебнике, потому что и без них моск морщится и приходится уделять большее время второстепенным вопросам, которые, возможно, мне понадобятся не раньше чем через год... и именно осознанный пропуск данной информации и послужил основой для поднятия этой темы. просто с вашим опытом, это кажется ошибкой или некомпетентностью, а для меня, как новичка, это пока не столь важно, и я стараюсь уделить больше внимания тому материалу, который явно влияет на результат выполнения программы, до тех пор, пока меня устраивает int. но тем не менее, спасибо вам за совет
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
23.08.2015, 12:08
Цитата Сообщение от rep plz Посмотреть сообщение
то придётся зубрить
Не надо ничего зубрить. Нужно больше практики и понимание придет само без всякой зубрежки.
Если сейчас выводить правила в стиле "если - то", то их получится гораздо больше, чем типов в языке, потому что у каждого типа множество различных применений в зависимости от ситуации.
Вот простой пример:
C++
1
char buf[100];
Что это, строка? Или буфер для чтения из сети? Или, может быть, мы сюда будем сериализовать данные для записи в файл? Или здесь будет размещаться объект посредством placement new?

Главное помнить, что серебряной пули нет. Нет одного универсального правила на все случаи жизни. Могут быть только рекомендации, например:
- использовать size_t для обозначения размеров, это беззнаковый целый тип.
- использовать ptrdiff_t для разницы указателей, это знаковый целый тип.
Кстати, прочитать про это можно тут.
4
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.08.2015, 16:07
Цитата Сообщение от 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
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
23.08.2015, 17:51
Цитата Сообщение от ValeryS Посмотреть сообщение
есть типы
unsugned int
signed int
int
последний может принимать значение и первого и второго зависит от настроек
Это вы сами придумали или прочитали где-то?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.08.2015, 18:14
Цитата Сообщение от Mr.X Посмотреть сообщение
Это вы сами придумали или прочитали где-то?
смею предположить, что господин ValeryS прочитал это здесь:
http://en.cppreference.com/w/cpp/language/types
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
23.08.2015, 18:19
Цитата Сообщение от Mr.X Посмотреть сообщение
Это вы сами придумали или прочитали где-то?
это насчет
Цитата Сообщение от ValeryS Посмотреть сообщение
int
последний может принимать значение и первого и второго зависит от настроек(чаще всего signed)
во первых, я это писал три года назад, и меня тут же поправили
Цитата Сообщение от accept Посмотреть сообщение
signed введён из-за char, который может иметь знак, а может не иметь знака
да, согласен,спутал с char-ом
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.08.2015, 18:27
Цитата Сообщение от ValeryS Посмотреть сообщение
во первых, я это писал три года назад, и меня тут же поправили
это при том, что ваш тезис - корректен.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
23.08.2015, 18:30
Цитата Сообщение от ValeryS Посмотреть сообщение
я это писал три года назад
Ой, пардон, не заметил.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.08.2015, 18:30

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru