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

Зачем нужны модификаторы типов? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.97
koder
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
14.06.2012, 18:44     Зачем нужны модификаторы типов? #1
Читаю Шилдта и все более менее понятно,но насчет unsigned , signed , shot , long что то вообще дыра в понимании и их пропускал,а потом пришлось вернутся.Наверно это из-за того,что для меня не понятны многие моменты и их описания.Например,что за таблица,в которой написаны : типы,биты,диапазон?Биты - размер,но не ясно зачем знать какой он и где это применяется.Диапазон - ^_^,к примеру что это -128 127 и опять же зачем?Книжку ещё не дочитал и может забегаю на перед,но Шилдт так уверено примеры дает и пишет о них,что кажется я уже должен ясно понимать о чем идет речь.Пожалуйста объясните максимально подробно и понятно(гугл не помог).
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21451 / 10236 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
14.06.2012, 19:30     Зачем нужны модификаторы типов? #2
1) Числа со знаком называются "signed". Как ты знаешь, знак числа занимает один бит. Рассмотрим байт. В нем 8 бит. Если старший бит использовать для знака, то на число остаётся 7 бит. В семи битах можно максимально уместить число 127. Если же знак не используется, то числа наз. "unsigned". Беззнаковые числа всегда неотрицательны. В тех же 8 битах можно разместить число от 0 до 255.

2) short и long обеспечивают нужный диапазон чисел. Так short может быть двухбайтовым целым, а long - 4-байтовым (это зависит от реализации языка)
koder
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
14.06.2012, 20:22  [ТС]     Зачем нужны модификаторы типов? #3
Ясно,ну а где это все пригодится?
Vlad1slav
21 / 21 / 5
Регистрация: 16.09.2009
Сообщений: 111
14.06.2012, 20:37     Зачем нужны модификаторы типов? #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от koder Посмотреть сообщение
Ясно,ну а где это все пригодится?
При программировании пригодиться))

short используется для экономии памяти, если у тебя очень большой массив данных храниться, допустим на 10^9 элементов, то int займёт 4 Гб, а short в 2 раза меньше(хотя на некоторых компах int=short).

long используется если тебе не достаточно диапозона inta, например тебе надо хранить числа порядка 10^10. Если ты попытаешься сохранить такое число в int, то у тебя будет переполнение и в результате ты не сможешь восстановить то число, которое сохранил в переменную.

unsigned используется в тех случаях, когда ты точно знаешь что в данную переменную не будешь записывать отрицательные числа(для экономии того самого знакового бита).

Во всех языках программирования есть разние типы данных, разного диапозона.
Беззнаковые типы тоже встречаются во многих языках, но в некоторых нет, например java.
koder
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
14.06.2012, 21:03  [ТС]     Зачем нужны модификаторы типов? #5
Интересно для каких это проектов понадобится).Ну суть понята спасибо,странно что Шилдт этой теме уделяет время в книге для начинающих ибо без реальной задачи с оптимизацией тяжело разобраться.
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
14.06.2012, 21:09     Зачем нужны модификаторы типов? #6
C и C++ имеют низкоуровневые методы, поэтому таким вещам учить необходимо. В большинстве случаев можно обойтись int и double. Но когда для задачи оказывается критически важными объем памяти, точность вычислений, либо взаимодействие с другими платформами/технологиями, то знать столь низкоуровневую информацию о типах нужно.
koder
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
14.06.2012, 21:34  [ТС]     Зачем нужны модификаторы типов? #7
Я и не спорю о таком,конечно нужно,но имхо для новичка в книге Шилдта слишком поверхностная подача этих низкоуровневых методов,если уж без глубины описывать что то,то лучше совсем не писать.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
14.06.2012, 22:02     Зачем нужны модификаторы типов? #8
Цитата Сообщение от Vlad1slav Посмотреть сообщение
long используется если тебе не достаточно диапозона inta, например тебе надо хранить числа порядка 10^10.
Только long обычно не больше 4 байт, так что 10^10 в него скорее всего не влезет.
Vlad1slav
21 / 21 / 5
Регистрация: 16.09.2009
Сообщений: 111
15.06.2012, 16:53     Зачем нужны модификаторы типов? #9
Цитата Сообщение от koder Посмотреть сообщение
Я и не спорю о таком,конечно нужно,но имхо для новичка в книге Шилдта слишком поверхностная подача этих низкоуровневых методов,если уж без глубины описывать что то,то лучше совсем не писать.
Возьмите любую другую книжку, даже по тому же Паскалю... Везде среди первых глав вы найдёте описание типов данного языка. Так заведено, привыкайте)

Цитата Сообщение от Somebody Посмотреть сообщение
Только long обычно не больше 4 байт, так что 10^10 в него скорее всего не влезет.
Я же образно, цифры с потолка брал, чтобы пояснить разницу между long и int(Хотя зачастую в них и вправду разницы нет, зависит от процессора)
4*10^9 влезит)
Байт
 Аватар для Байт
13964 / 8795 / 1223
Регистрация: 24.12.2010
Сообщений: 15,930
15.06.2012, 20:59     Зачем нужны модификаторы типов? #10
Цитата Сообщение от Somebody Посмотреть сообщение
Только long обычно не больше 4 байт, так что 10^10 в него скорее всего не влезет.
На 64-х битовых процессорах long уже становится 8-ми байтовым. (от транслятора, конечно, зависит, но они как правило стараются на всю катушку)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.06.2012, 06:48     Зачем нужны модификаторы типов? #11
signed - это знаковый, unsigned - беззнаковый.
На лекции было всего два студента, внезапно встали и ушли пятеро, а лектор и говорит: сейчас придут ещё трое и вообще ни кого не останется.
Количество - это всегда unsigned, так как оно не может быть отрицательным. Но если разрядность большая, есть защита от неправильных входных данных, а максимально допустимое значение мало, то можно unsigned не ставить. unsigned уже даёт встроенную защиту от отрицательных и позволяет избежать if, но не позволяет сравнивать с нолём в цикле, если цикл до ноля включительно. Но если у тебя условие строго >0, или даже какого то положительного числа, то это не актуально и
C++
1
2
unsigned int i; 
for (i=n-1; i<n; --i)// на последнем шаге цикла i переполнится вниз при --i и станет равно максимально представимому значению, что больше любого другого n, а если n максимально представимо, то равно n
.
ноль программистов ругал сердитый шев, потом уволил одного и стало их FF.
FF в unsigned - это по-десятичному 255, а не -1. То есть ноль минус один равно много. Получается, что сравнение с нолём тоже не так актуально. Да и цикл может быть не до ноля включительно, а до ноля, не включая его, то есть до единицы включительно,
C++
1
2
unsigned int i; 
for (i=n; i>0; --i)// тоже сработает
. Если число может быть и отрицательным, то оно всегда signed. small, short, long, hyper и long long - разрядность. sizereof(small)<sizereof(short)<=sizereof(int)<=sizereof(long)<<sizereof(long long). И sizereof(long)<sizeof(hyper). Но как соотносятся long long и hyper и есть ли вообще в диалекте small и hyper - отдельный вопрос, общего ответа не имеющий.

Добавлено через 55 секунд
Цитата Сообщение от koder Посмотреть сообщение
Диапазон - ^_^,к примеру что это -128 127 и опять же зачем?
Ну а если ты с дуру введёшь 200?

Добавлено через 3 минуты
Цитата Сообщение от Vlad1slav Посмотреть сообщение
hort используется для экономии памяти, если у тебя очень большой массив данных храниться, допустим на 10^9 элементов, то int займёт 4 Гб, а short в 2 раза меньше(хотя на некоторых компах int=short).
long займёт больше, чем short. Во сколько раз - вопрос отдельный. Обычно в два. А может в четыре? А вот int займёт ровно столько же, сколько или short, или long.

Добавлено через 2 минуты
Цитата Сообщение от Байт Посмотреть сообщение
На 64-х битовых процессорах long уже становится 8-ми байтовым. (от транслятора, конечно, зависит, но они как правило стараются на всю катушку)
А short - 4-х? Врядли. И int там обычно 4 байта. Разрядность повышали не для арифметики, а для адреса и мемсайзных типов. То есть для памяти и количества данных: аддерсное пространство x64 = 16ЭБ.

Добавлено через 1 минуту
Цитата Сообщение от koder Посмотреть сообщение
Интересно для каких это проектов понадобится).Ну суть понята спасибо,странно что Шилдт этой теме уделяет время в книге для начинающих ибо без реальной задачи с оптимизацией тяжело разобраться.
А при чём здесь вообще оптимизация?
koder
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
17.06.2012, 14:51  [ТС]     Зачем нужны модификаторы типов? #12
taras atavin
Спасибо за пояснения,примерно разобрался,а там уже когда столкнусь с такой задачей,то буду углубляться и ещё раз перечитаю сообщения в этой теме)

Добавлено через 12 минут
А почему говорят что signed int , unsigned int и int - это три разные типа, ведь signed int и int идентичны или я не прав?
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
17.06.2012, 17:03     Зачем нужны модификаторы типов? #13
Цитата Сообщение от koder Посмотреть сообщение
А почему говорят что signed int , unsigned int и int - это три разные типа, ведь signed int и int идентичны или я не прав?
Кто так говорит? char, signed char и unsigned char в C++ - три разных, но int и signed int - одно и то же.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
17.06.2012, 17:15     Зачем нужны модификаторы типов? #14
signed, unsigned, short, long по своей сути НЕ являются модификаторами типов. Это ключевые слова, которые задают разные типы. Т.е. "short int" НЕ надо рассматривать как тип int с модификаторам, а следует рассматривать просто как отдельный целочисленный тип. Каждый целочисленный тип обладает двумя основными характеристиками: размер и знаковость. Размер определяет то, сколько бит отводится для хранения числа. Чем больше бит, чем бОльший диапазон значений можно хранить в данном типе. Знаковость числа влияет на то, как число будет трактоваться. Более подробно описывал в посте N11 в данной теме: Signed/Unsigned. Но лучше всю тему просмотри

Ну и так, для порядку: http://www.cyberforum.ru/blogs/18334/blog69.html

Цитата Сообщение от taras atavin Посмотреть сообщение
А вот int займёт ровно столько же, сколько или short, или long
Бред. В 64-разрядных режимах short=2, int=4, long=8
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.06.2012, 17:32     Зачем нужны модификаторы типов? #15
Цитата Сообщение от Evg Посмотреть сообщение
Бред. В 64-разрядных режимах short=2, int=4, long=8
Да? Не знал.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
17.06.2012, 17:54     Зачем нужны модификаторы типов? #16
Зависит от архитектуры системы, в Win, например, long останется 4 байтным.
Вот примерная таблица:

Код
// Data models 
// Data Type            LP32    ILP32    SILP64    ILP64    LLP64    LP64 
// char                    8        8        8        8        8        8 
// short                  16        16      64        16       16       16 
// int                    16        32      64        64       32       32 
// long                   32        32      64        64       32       64 
// long long (int64)      64        64      64        64       64       64
// pointer                32        32      64        64       64       64 

// __int8                 8         8         8         8         8         8
// __int16                16        16        16        16        16        16
// __int32                32        32        32        32        32        32
// __int64                64        64        64        64        64        64
На сколько мне известно: Win - LLP64, unix-подобные - LP64.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
17.06.2012, 18:21     Зачем нужны модификаторы типов? #17
На всякий случай, не всем очевидно. LP64 означает, что Long и Pointer имеют размер 64 бита (long long автоматически 64-битный, т.к. он должен быть больше или равен long'у, других 64-битных целочисленных типов нет). LLP64 - Long Long и Pointer имеют размер 64 (других 64-битных целочисленных типов нет). Мне всегда казалось, что 32-битные коды под винду и под юникс - это LP32, а 64-битные под винду и под юникс - LP64. Это две основные настройки современных 32- и 64-битных режимов. Но 64-битной винды нет, чтобы проверить, всё остальное (32- под винду и юникс, 64- под юникс) - верно
koder
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
17.06.2012, 18:52  [ТС]     Зачем нужны модификаторы типов? #18
Цитата Сообщение от Somebody Посмотреть сообщение
Кто так говорит? char, signed char и unsigned char в C++ - три разных, но int и signed int - одно и то же.
Так у char и signed char одинаковый диапазон, но при этом другой размер или ещё что то?

Добавлено через 17 минут
Цитата Сообщение от Evg Посмотреть сообщение
signed, unsigned, short, long по своей сути НЕ являются модификаторами типов. Это ключевые слова, которые задают разные типы. Т.е. "short int" НЕ надо рассматривать как тип int с модификаторам, а следует рассматривать просто как отдельный целочисленный тип. Каждый целочисленный тип обладает двумя основными характеристиками: размер и знаковость. Размер определяет то, сколько бит отводится для хранения числа. Чем больше бит, чем бОльший диапазон значений можно хранить в данном типе. Знаковость числа влияет на то, как число будет трактоваться. Более подробно описывал в посте N11 в данной теме: Signed/Unsigned. Но лучше всю тему просмотри

Ну и так, для порядку: http://www.cyberforum.ru/blogs/18334/blog69.html
Спасибо за статью.А что тогда понимать под модификаторами?
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
17.06.2012, 19:07     Зачем нужны модификаторы типов? #19
Цитата Сообщение от koder Посмотреть сообщение
char и signed char
это 1 и то же

Цитата Сообщение от koder Посмотреть сообщение
А что тогда понимать под модификаторами?
extern, static, register, const etc...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2012, 19:19     Зачем нужны модификаторы типов?
Еще ссылки по теме:

C++ Зачем нужны деревья?
C++ зачем нужны итераторы?
C++ Зачем нужны указатели?

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
17.06.2012, 19:19     Зачем нужны модификаторы типов? #20
Цитата Сообщение от koder Посмотреть сообщение
Так у char и signed char одинаковый диапазон, но при этом другой размер или ещё что то?
В статье об этом написано. Это два разных типа но с одинаковыми характеристиками (на большинстве компиляторов).

Добавлено через 2 минуты
Цитата Сообщение от OstapBender Посмотреть сообщение
это 1 и то же
Запусти данный код на Си++ и увидишь, что это не так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
void func (char c)
{
  std::cout << "aaa\n";
}
 
void func (signed char c)
{
  std::cout << "bbb\n";
}
 
int main (void)
{
  char c = 0;
  signed char sc = 0;
 
  func (c);
  func (sc);
}
Yandex
Объявления
17.06.2012, 19:19     Зачем нужны модификаторы типов?
Ответ Создать тему
Опции темы

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