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

Преобразование типов, как понять фразу из учебника - C++

Восстановить пароль Регистрация
 
foreblack
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 33
21.07.2015, 13:34     Преобразование типов, как понять фразу из учебника #1
В книжке "Язык программирования C++" (Липпман) есть такой абзац. Не могу разобраться остаток от деления по модулю каких чисел берется? Остаток от деления по модулю 256 это как? Что на что делится?
Если объекту беззнакового типа присваивается значение не из его диапазона, результатом будет остаток от деления по модулю значения, которые способен содержать тип назначения. Например, 8-битовый тип unsigned char способен содержать значения от 0 до 255 включительно. Если присвоить ему значение вне этого диапазона, то компилятор присвоит ему остаток от деления по модулю 256. Поэтому в результате присвоения значения -1 переменной 8-битового типа unsigned char будет получено значение 255.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2015, 13:34     Преобразование типов, как понять фразу из учебника
Посмотрите здесь:

Преобразование типов C++
Преобразование типов C++
Преобразование типов. C++
C++ Как осуществляется преобразование типов (для чего)?
C++ Преобразование типов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.07.2015, 14:05     Преобразование типов, как понять фразу из учебника #2
C++
1
2
3
4
5
6
7
8
9
10
11
#include <limits>
 
int main()
{
   unsigned char uc = 0;
   uc = 1000;
   std::cout << static_cast<int>(uc)
             << " == "
             << uc % std::numeric_limits<unsigned char>::max()
             << std::endl;
}
foreblack
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 33
21.07.2015, 14:57  [ТС]     Преобразование типов, как понять фразу из учебника #3
DiffEreD, тут вроде все понятно, но если uc = -1, то результатом программы будет 255==0.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.07.2015, 16:02     Преобразование типов, как понять фразу из учебника #4
Скорее всего так должно быть:
C++
1
2
3
4
5
6
7
8
9
int main()
{
   unsigned char uc = 0;
   uc = -1;
   std::cout << static_cast<int>(uc)
             << " == "
             << uc % (std::numeric_limits<unsigned char>::max() + 1)
             << std::endl;
}
foreblack
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 33
21.07.2015, 16:55  [ТС]     Преобразование типов, как понять фразу из учебника #5
DiffEreD, все равно я что-то не понимаю, что на что делится.

Добавлено через 1 минуту
Объясните мне эту фразу "Если присвоить ему значение вне этого диапазона, то компилятор присвоит ему остаток от деления по модулю 256". Деление чего на что?
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,538
Записей в блоге: 27
21.07.2015, 17:06     Преобразование типов, как понять фразу из учебника #6
foreblack,
C++
1
2
3
4
5
6
7
8
9
int main()
{
    unsigned int temp_i = 300;
    unsigned char temp_c = temp_i;
 
    std::cout << "\nTemp = " << static_cast<int>(temp_c);
    std::cout << "\n " << temp_i%256;
    system("pause>>null");
}
В данном случае, мы присваиваем чару значение больше 255. В итоге, следуя вышесказанному, в переменной будет лежать (значение%256). Я специально Вам еще интовую переменную завела, чтобы Вы видели, что всё совпадает.

Добавлено через 1 минуту
Цитата Сообщение от foreblack Посмотреть сообщение
Деление чего на что?
Значение, которые Вы засетили, делиться на 256. Результат будет лежать в переменной чар.
То есть, введёте 400 - это больше 255. В чар такое не влазит. Потому он себе присвоит 400%256 = 144. Можете проверить на моём коде.
foreblack
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 33
21.07.2015, 17:15  [ТС]     Преобразование типов, как понять фразу из учебника #7
Тамика, теперь все понятно. Только не понятно как с отрицательными числами работает. Если я присваиваю unsigned char -1, то -1%256 = -1.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.07.2015, 20:50     Преобразование типов, как понять фразу из учебника #8
foreblack, -1 присваевается переменной беззнакового типа unsigned char. При присвоении отрицательного числа беззнаковому типу происходит преобразование отрицательного значения в беззнаковое. При этом происходит так называемое "обращение значения" (wrap around) и переменной uc присваиваеться значение 255. И потом это делится так:
C++
1
255 % 256 == 255
foreblack
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 33
21.07.2015, 21:29  [ТС]     Преобразование типов, как понять фразу из учебника #9
DiffEreD, ок, а как -1 преобразуется в беззнаковое?
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,538
Записей в блоге: 27
22.07.2015, 08:15     Преобразование типов, как понять фразу из учебника #10
foreblack, для этого нужно знать кодировки. Дополнительный код и Google. Если не разберетесь - пишите.
foreblack
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 33
22.07.2015, 13:08  [ТС]     Преобразование типов, как понять фразу из учебника #11
Тамика, зачем кодировки знать? Если это связано с типом char, то можно объяснить на примере unsigned int и signed int. С дополнительным кодом и представлением чисел в памяти компьютера разобрался.
Интуитивно я понимаю, как преобразуются типы.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,128
Записей в блоге: 26
22.07.2015, 13:15     Преобразование типов, как понять фразу из учебника #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Тут просто написано языком "для домохозяек". По смыслу, если у тебя есть 8-битное число, в него присваивается 16-битное (или 32, или 64) значение, то отбрасываются все биты за исключением младших 8 бит.
foreblack
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 33
22.07.2015, 14:04  [ТС]     Преобразование типов, как понять фразу из учебника #13
Evg, переменная "a" в памяти выглядит как 11111111. Если мы присваиваем "a" переменной "b", то "b" эти "единички" "считает" прямым кодом?
C++
1
2
signed char a = -1;
unsigned char b = a;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2015, 08:56     Преобразование типов, как понять фразу из учебника
Еще ссылки по теме:

C++ Строковые потоки. Преобразование типов (как сделать чтобы из строки число полностью преобразовывалось в double без потери чисел)
C++ Преобразование типов - как строку чисел перевести в целочисленный массив ?
C++ Преобразование типов

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,128
Записей в блоге: 26
23.07.2015, 08:56     Преобразование типов, как понять фразу из учебника #14
Цитата Сообщение от foreblack Посмотреть сообщение
Если мы присваиваем "a" переменной "b", то "b" эти "единички" "считает" прямым кодом?
Signed/Unsigned

Прямым или обратным кодом считают арифметические операции (а не операции копирования), да и то только те, которым это критично (типа деления или сдвигов). При копировании или преобразовании типов (в виде обрезания) набор нулей и единичек просто копируется из одного места памяти в другое, совершенно не задумываясь о том, прямой там код, кривой код или ещё что-то. Знаковость - это НЕ свойство хранения, это свойство обработки данных.

Добавлено через 17 часов 38 минут
Сюда же:
Signed/Unsigned
Yandex
Объявления
23.07.2015, 08:56     Преобразование типов, как понять фразу из учебника
Ответ Создать тему
Опции темы

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