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

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

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

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

23.02.2013, 23:41. Просмотров 261. Ответов 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++
Создать функцию для вывода на экран целого числа в двоичной системе счисления с применением побитовых операций. C++
Пояснение побитовых операций C++
Приоритет побитовых операций C++
Перевод Unsigned char в двоичный вид с использованием побитовых операций C++
C++ Установка бита с использованием побитовых операций
C++ Странное распараллеливание
C++ Перевод десятичного вещественного числа в двоичное путем побитовых операций (Делить на 2 нельзя)
C++ Определение остатка от деления с помощью побитовых операций
C++ Странное поведение строки
Странное поведение cin C++
C++ Программа для демонстрации работы побитовых операторов не компилируется

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5408 / 1791 / 327
Регистрация: 10.12.2010
Сообщений: 5,293
Записей в блоге: 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
 Аватар для HighPredator
5408 / 1791 / 327
Регистрация: 10.12.2010
Сообщений: 5,293
Записей в блоге: 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     Странное взаимовлияние побитовых операций
Ответ Создать тему
Опции темы

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