Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

Как осуществляется преобразование типов (для чего)? - 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++
кое-что о преобразовании типов. float F; __int32 DW; DW=*(__int32 *)&F; значение DW должно совпадать с F побитово, без всяких...

Преобразование типов - C++
Увидел код в сети, решил откомпилировать. Думаю какой код не важно. вылезла куча ошибок. на это LPSTR ActW = new TCHAR; ругается с...

13
DiffEreD
1439 / 776 / 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;
}
1
foreblack
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 33
21.07.2015, 14:57  [ТС] #3
DiffEreD, тут вроде все понятно, но если uc = -1, то результатом программы будет 255==0.
0
DiffEreD
1439 / 776 / 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;
}
0
foreblack
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 33
21.07.2015, 16:55  [ТС] #5
DiffEreD, все равно я что-то не понимаю, что на что делится.

Добавлено через 1 минуту
Объясните мне эту фразу "Если присвоить ему значение вне этого диапазона, то компилятор присвоит ему остаток от деления по модулю 256". Деление чего на что?
0
Тамика
Котовчанин
918 / 462 / 145
Регистрация: 16.02.2010
Сообщений: 3,264
Записей в блоге: 28
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. Можете проверить на моём коде.
1
foreblack
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 33
21.07.2015, 17:15  [ТС] #7
Тамика, теперь все понятно. Только не понятно как с отрицательными числами работает. Если я присваиваю unsigned char -1, то -1%256 = -1.
0
DiffEreD
1439 / 776 / 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
1
foreblack
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 33
21.07.2015, 21:29  [ТС] #9
DiffEreD, ок, а как -1 преобразуется в беззнаковое?
0
Тамика
Котовчанин
918 / 462 / 145
Регистрация: 16.02.2010
Сообщений: 3,264
Записей в блоге: 28
22.07.2015, 08:15 #10
foreblack, для этого нужно знать кодировки. Дополнительный код и Google. Если не разберетесь - пишите.
1
foreblack
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 33
22.07.2015, 13:08  [ТС] #11
Тамика, зачем кодировки знать? Если это связано с типом char, то можно объяснить на примере unsigned int и signed int. С дополнительным кодом и представлением чисел в памяти компьютера разобрался.
Интуитивно я понимаю, как преобразуются типы.
0
Evg
Эксперт CАвтор FAQ
18884 / 6840 / 498
Регистрация: 30.03.2009
Сообщений: 19,263
Записей в блоге: 30
22.07.2015, 13:15 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Тут просто написано языком "для домохозяек". По смыслу, если у тебя есть 8-битное число, в него присваивается 16-битное (или 32, или 64) значение, то отбрасываются все биты за исключением младших 8 бит.
1
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;
0
Evg
Эксперт CАвтор FAQ
18884 / 6840 / 498
Регистрация: 30.03.2009
Сообщений: 19,263
Записей в блоге: 30
23.07.2015, 08:56 #14
Цитата Сообщение от foreblack Посмотреть сообщение
Если мы присваиваем "a" переменной "b", то "b" эти "единички" "считает" прямым кодом?
Signed/Unsigned

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

Добавлено через 17 часов 38 минут
Сюда же:
Signed/Unsigned
1
23.07.2015, 08:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2015, 08:56
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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