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

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

Войти
Регистрация
Восстановить пароль
 
dikanev
21 / 21 / 1
Регистрация: 28.05.2010
Сообщений: 67
#1

Странное взаимовлияние побитовых операций - C++

23.02.2013, 23:41. Просмотров 274. Ответов 4
Метки нет (Все метки)

Запускаю в VS C++ 2012
C
1
2
3
4
5
6
    int shift = 30;
    long long x = 1<<shift;
    long long y = ~0;
    //int x = 1<<shift;
    //int y = ~0;
    printf("%x\n%x\n", x, y);
Получаю
Код
40000000
0
Меняю shift на 31, получаю
Код
80000000
ffffffff
Получается, что значение y меняется в зависимости от того, что я делаю с x. Если поменять тип на int, такого безобразия не наблюдается. Что бы это могло быть?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2013, 23:41     Странное взаимовлияние побитовых операций
Посмотрите здесь:

Приоритет побитовых операций - C++
Всем привет. Столкнулся с непоняшкой: // Объявляем два массива и инициализируем их unsigned char A={0xFF, 0x03, 0x00,...

Пояснение побитовых операций - C++
Прошу объяснить на пальцах/на примере что значит следующая строчка, каким именно образом осуществляется сдвиг вправо на 4 разряда? что...

Установка бита с использованием побитовых операций - C++
Есть следующая программа, которой задается само число/символ (unsigned char), переводит программа в двоичный вид, и бит, который был задан...

Определение остатка от деления с помощью побитовых операций - C++
Народ, недавно начал изучать С++ и наткнулся на один пример. Никак не могу додуматься как его решить. Надеюсь тут есть старшие товарищи...

Перевод Unsigned char в двоичный вид с использованием побитовых операций - C++
Вводится с клавиатуры переменная типа unsigned char, с помощью побитовых операций переводится в двоичный вид и выводится на экран....

Перевод десятичного вещественного числа в двоичное путем побитовых операций (Делить на 2 нельзя) - C++
Нужно написать код на С++, который переводит вещественное десятичное число в двоичное с помощью битовых операторов(Сдвиги, &amp;, | и т.п) ...

Создать функцию для вывода на экран целого числа в двоичной системе счисления с применением побитовых операций. - C++
Создать функцию для вывода на экран целого числа в двоичной системе счисления с применением побитовых операций. Использовать функцию при...

Программа для демонстрации работы побитовых операторов не компилируется - C++
Добрый вечер всем! Я учусь программированию на С++. Написал небольшую программу из книжки. Программа для демонстрации работы побитовых...

Странное решение - C++
Тут встретился в книжонке с таким выводом 2-мерного массива, вроде простой, но вывод странный. Не дадите комент по странной строке: ...

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

Странное поведение транслятора - C++
В следуюшем примере код компилируется нормально, но объект класса b не содается (пробывал на Visual studio 10 и на Borland builder 5), что...

Странное поведение в коде - C++
Есть два класса: ArrayList&lt;T&gt; и Array&lt;T&gt; (реализация в конце поста). И есть такой код: ArrayList&lt;int&gt; list = { 1, 2, 3 }; ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
5464 / 1830 / 338
Регистрация: 10.12.2010
Сообщений: 5,412
Записей в блоге: 3
23.02.2013, 23:53     Странное взаимовлияние побитовых операций #2
Цитата Сообщение от dikanev Посмотреть сообщение
Что бы это могло быть?
Неправильное использование спецификатора %x. Он используется для беззнаковых целых. Во-вторых, раз вы используете long long тогда желательно указывать спецификаторы длины, перед спецификатором типа.
dikanev
21 / 21 / 1
Регистрация: 28.05.2010
Сообщений: 67
24.02.2013, 00:25  [ТС]     Странное взаимовлияние побитовых операций #3
Слегка изменил код:
C
1
2
3
4
5
    int shift = 30;
    unsigned long long int x = 1<<shift;
    unsigned long long int y = ~0;
    unsigned int z = y;
    printf("%x\n%x\n%x\n", x, y, z);
Получил
Код
40000000
0
ffffffff
Дописывание unsigned не помогло. Похоже, дело в неумении printf'а со спецификатором %x выводить long long целые числа.
HighPredator
5464 / 1830 / 338
Регистрация: 10.12.2010
Сообщений: 5,412
Записей в блоге: 3
24.02.2013, 00:27     Странное взаимовлияние побитовых операций #4
Цитата Сообщение от dikanev Посмотреть сообщение
Похоже, дело в неумении printf'а со спецификатором %x выводить long long целые числа.
Я же написал:
Цитата Сообщение от HighPredator Посмотреть сообщение
раз вы используете long long тогда желательно указывать спецификаторы длины, перед спецификатором типа.
То есть должно быть так:
C
1
printf("%llx\n%llx\n%llx\n", x, y, z);
dikanev
21 / 21 / 1
Регистрация: 28.05.2010
Сообщений: 67
24.02.2013, 00:46  [ТС]     Странное взаимовлияние побитовых операций #5
Теперь понял, спасибо.
Yandex
Объявления
24.02.2013, 00:46     Странное взаимовлияние побитовых операций
Ответ Создать тему
Опции темы

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