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

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

Восстановить пароль Регистрация
 
dikanev
21 / 21 / 1
Регистрация: 28.05.2010
Сообщений: 67
23.02.2013, 23:41     Странное взаимовлияние побитовых операций #1
Запускаю в 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     Странное взаимовлияние побитовых операций
Посмотрите здесь:

Вставить между цифрами 1, 2,..., 8, 9 в данном порядке, знак одной из 4-х арифметических операций так, чтобы результат восьми послед-х операций =100 C++
Создать функцию для вывода на экран целого числа в двоичной системе счисления с применением побитовых операций. C++
C++ Странное поведение
Пояснение побитовых операций C++
Приоритет побитовых операций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5342 / 1725 / 320
Регистрация: 10.12.2010
Сообщений: 5,108
Записей в блоге: 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
5342 / 1725 / 320
Регистрация: 10.12.2010
Сообщений: 5,108
Записей в блоге: 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     Странное взаимовлияние побитовых операций
Ответ Создать тему
Опции темы

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