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

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

14.06.2012, 18:44. Показов 9542. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Читаю Шилдта и все более менее понятно,но насчет unsigned , signed , shot , long что то вообще дыра в понимании и их пропускал,а потом пришлось вернутся.Наверно это из-за того,что для меня не понятны многие моменты и их описания.Например,что за таблица,в которой написаны : типы,биты,диапазон?Биты - размер,но не ясно зачем знать какой он и где это применяется.Диапазон - ^_^,к примеру что это -128 127 и опять же зачем?Книжку ещё не дочитал и может забегаю на перед,но Шилдт так уверено примеры дает и пишет о них,что кажется я уже должен ясно понимать о чем идет речь.Пожалуйста объясните максимально подробно и понятно(гугл не помог).
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2012, 18:44
Ответы с готовыми решениями:

Для чего нужны модификаторы protected, private, public
подскажите, кто в курсе, зачем вообще нужны эти модификаторы доступа? ведь, все их можно обойти......

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

Зачем нужны перечисления в С++?
int main(братья) Снова зову коллективный разум! Дошел в книжке до перечислений и не пойму зачем...

Зачем нужны исключения?
Добрый вечер, прочитал статью об исключениях, не очень понимаю, почему бы не заменить их просто...

21
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,653
Записей в блоге: 13
14.06.2012, 19:30 2
1) Числа со знаком называются "signed". Как ты знаешь, знак числа занимает один бит. Рассмотрим байт. В нем 8 бит. Если старший бит использовать для знака, то на число остаётся 7 бит. В семи битах можно максимально уместить число 127. Если же знак не используется, то числа наз. "unsigned". Беззнаковые числа всегда неотрицательны. В тех же 8 битах можно разместить число от 0 до 255.

2) short и long обеспечивают нужный диапазон чисел. Так short может быть двухбайтовым целым, а long - 4-байтовым (это зависит от реализации языка)
1
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
14.06.2012, 20:22  [ТС] 3
Ясно,ну а где это все пригодится?
0
21 / 21 / 7
Регистрация: 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.
3
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
14.06.2012, 21:03  [ТС] 5
Интересно для каких это проектов понадобится).Ну суть понята спасибо,странно что Шилдт этой теме уделяет время в книге для начинающих ибо без реальной задачи с оптимизацией тяжело разобраться.
0
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512
14.06.2012, 21:09 6
C и C++ имеют низкоуровневые методы, поэтому таким вещам учить необходимо. В большинстве случаев можно обойтись int и double. Но когда для задачи оказывается критически важными объем памяти, точность вычислений, либо взаимодействие с другими платформами/технологиями, то знать столь низкоуровневую информацию о типах нужно.
0
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
14.06.2012, 21:34  [ТС] 7
Я и не спорю о таком,конечно нужно,но имхо для новичка в книге Шилдта слишком поверхностная подача этих низкоуровневых методов,если уж без глубины описывать что то,то лучше совсем не писать.
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
14.06.2012, 22:02 8
Цитата Сообщение от Vlad1slav Посмотреть сообщение
long используется если тебе не достаточно диапозона inta, например тебе надо хранить числа порядка 10^10.
Только long обычно не больше 4 байт, так что 10^10 в него скорее всего не влезет.
0
21 / 21 / 7
Регистрация: 16.09.2009
Сообщений: 111
15.06.2012, 16:53 9
Цитата Сообщение от koder Посмотреть сообщение
Я и не спорю о таком,конечно нужно,но имхо для новичка в книге Шилдта слишком поверхностная подача этих низкоуровневых методов,если уж без глубины описывать что то,то лучше совсем не писать.
Возьмите любую другую книжку, даже по тому же Паскалю... Везде среди первых глав вы найдёте описание типов данного языка. Так заведено, привыкайте)

Цитата Сообщение от Somebody Посмотреть сообщение
Только long обычно не больше 4 байт, так что 10^10 в него скорее всего не влезет.
Я же образно, цифры с потолка брал, чтобы пояснить разницу между long и int(Хотя зачастую в них и вправду разницы нет, зависит от процессора)
4*10^9 влезит)
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
15.06.2012, 20:59 10
Цитата Сообщение от Somebody Посмотреть сообщение
Только long обычно не больше 4 байт, так что 10^10 в него скорее всего не влезет.
На 64-х битовых процессорах long уже становится 8-ми байтовым. (от транслятора, конечно, зависит, но они как правило стараются на всю катушку)
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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 Посмотреть сообщение
Интересно для каких это проектов понадобится).Ну суть понята спасибо,странно что Шилдт этой теме уделяет время в книге для начинающих ибо без реальной задачи с оптимизацией тяжело разобраться.
А при чём здесь вообще оптимизация?
2
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
17.06.2012, 14:51  [ТС] 12
taras atavin
Спасибо за пояснения,примерно разобрался,а там уже когда столкнусь с такой задачей,то буду углубляться и ещё раз перечитаю сообщения в этой теме)

Добавлено через 12 минут
А почему говорят что signed int , unsigned int и int - это три разные типа, ведь signed int и int идентичны или я не прав?
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
17.06.2012, 17:03 13
Цитата Сообщение от koder Посмотреть сообщение
А почему говорят что signed int , unsigned int и int - это три разные типа, ведь signed int и int идентичны или я не прав?
Кто так говорит? char, signed char и unsigned char в C++ - три разных, но int и signed int - одно и то же.
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
17.06.2012, 17:15 14
signed, unsigned, short, long по своей сути НЕ являются модификаторами типов. Это ключевые слова, которые задают разные типы. Т.е. "short int" НЕ надо рассматривать как тип int с модификаторам, а следует рассматривать просто как отдельный целочисленный тип. Каждый целочисленный тип обладает двумя основными характеристиками: размер и знаковость. Размер определяет то, сколько бит отводится для хранения числа. Чем больше бит, чем бОльший диапазон значений можно хранить в данном типе. Знаковость числа влияет на то, как число будет трактоваться. Более подробно описывал в посте N11 в данной теме: Signed/Unsigned. Но лучше всю тему просмотри

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

Цитата Сообщение от taras atavin Посмотреть сообщение
А вот int займёт ровно столько же, сколько или short, или long
Бред. В 64-разрядных режимах short=2, int=4, long=8
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
17.06.2012, 17:32 15
Цитата Сообщение от Evg Посмотреть сообщение
Бред. В 64-разрядных режимах short=2, int=4, long=8
Да? Не знал.
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
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.
2
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
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- под юникс) - верно
0
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. Но лучше всю тему просмотри

Ну и так, для порядку: https://www.cyberforum.ru/blogs/18334/blog69.html
Спасибо за статью.А что тогда понимать под модификаторами?
0
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
17.06.2012, 19:07 19
Цитата Сообщение от koder Посмотреть сообщение
char и signed char
это 1 и то же

Цитата Сообщение от koder Посмотреть сообщение
А что тогда понимать под модификаторами?
extern, static, register, const etc...
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
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);
}
1
17.06.2012, 19:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2012, 19:19
Помогаю со студенческими работами здесь

Зачем нужны скобочки?
Объясните пожалуйста зачем надо ставить в коде так много скобок? if(((a+b)*(a-b)))

Зачем нужны макросы?
Зачем нужны макросы?

Зачем нужны указатели
Не могу понять синтаксис указателей. Понял, что это работа с адресами, что оператор &amp; это адрес. А...

Зачем нужны сортировки
Скажите пожалуйста, зачем при подготовке к олимпиаде по программированию, нужно учить алгоритмы:...


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

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