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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
foreblack
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 33
#1

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

21.07.2015, 13:34. Просмотров 512. Ответов 13
Метки нет (Все метки)

В книжке "Язык программирования 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++
Как осуществляется преобразование типов (для чего)? int *p=(int*)str; // ругается на p Спасибо :) P.s Си

Как запретить преобразование типов при использовании cin - C++
Как запретить преобразование типов при использовании объекта потокового ввода cin. Проблема в том, что существует переменная типа int и со...

Преобразование типов - как строку чисел перевести в целочисленный массив ? - C++
Как строку чисел например 1343245 перевести в интовый масив.

Строковые потоки. Преобразование типов (как сделать чтобы из строки число полностью преобразовывалось в double без потери чисел) - C++
Всем привет я перевожу string в double следующим образом double fromString(const std::string& s) { std::istringstream iss(s); ...

Преобразование типов в С++ - C++
Задача: Определить два класса, String с преобразованием из char * в строку и обратно. Мой код: #include <iostream> ...

преобразование типов - C++
Здравствуйте, подскажите пожалуйста как преобразовать данные типа LPARAM в LPCWSTR

Преобразование типов - C++
Вообщем допустим есть два класа, класс T и класс A, комплексные числа в разной форме записи(тригонометрической и алгебраической). Для класа...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
1429 / 766 / 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
1429 / 766 / 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". Деление чего на что?
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,954
Записей в блоге: 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
1429 / 766 / 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 преобразуется в беззнаковое?
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,954
Записей в блоге: 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
Эксперт CАвтор FAQ
17542 / 5780 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 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++
Всем доброго здоровья. Не могу решить простенькую задачу, уже не знаю что делать.Суть такова нужно вытащить из строки(символьный тип),...

Преобразование типов - C++
Доброго времени суток, у меня вопрос возник из нежелания переписывать довольно большой кусок кода. Есть ли какой-нибудь способ сделать...

преобразование типов - C++
открываю файл при помощи функции fopen, имя файла нужно получить из OpenDialog! пытался вытащить путь к файлу в char, но fopen его не...

Преобразование типов - C++
Здравствуйте. Такая задача: Дано вещественное число r и целые неотрицательные m и n. Записать число r в строку в формате :m:n по...

преобразование типов - C++
memcpy((void*)stroka,(void*)stroka,ykaz_bukva-ykaz_temp+1); что нужно поставить вместо void* чтоб не было предупреждений


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

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

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru