![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
ksili |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Вот на такой код
Компилятор выдаёт warning:
то есть << - это получается 32-разрядный сдвиг? Т.е. сдвиг в 32-битной переменной. Однако мне надо сдвигать именно в 64 разрядах. Т.е. единица может попасть и в старшее двойное слово. А это не выполняется, т.к. нижеследующий код выводит ноль:
Может есть оператор для 64-битного сдвига? Я в MSDN-е такого не нашёл. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||||
|
|||||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
|
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Lazin, а что такой префикс можно использовать? У меня компилятор не понял.
Но я уже понял, что сдвигать надо тоже 64-битную переменную:
Добавлено через 6 минут и 21 секунду Что-то я сегодня туплю. Подумал, что это префикс lui (long unsigned int), а на самом деле это постфикс ui64. ![]() Спасибо. Добавлено через 6 минут и 37 секунд Что-то я сегодня туплю. Подумал, что это префикс lui (long unsigned int), а на самом деле это постфикс ui64. ![]() Спасибо. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
Thunderbolt |
|
||||||
![]() DevRel ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 7.11.2007 Где: Тула Репутация: 10 Всего: 16 |
Из статьи "20 ловушек переноса Си++ - кода на 64-битную платформу".
5. Операции сдвига Операции сдвига при невнимательном использовании могут принести много неприятностей во время перехода от 32-битной к 64-битной системе. Начнем с примера функции, выставляющей в переменной типа memsize, указанный вами бит в 1:
Приведенный код работоспособен на 32-битной архитектуре и позволяет выставлять биты с номерами от 0 до 31. После переноса программы на 64-битную платформу возникнет необходимость выставлять биты от 0 до 63. Как Вы думаете, какое значение вернет следующий вызов функции SetBitN(0, 32)? Если Вы думаете, что 0x100000000, то авторы рады, что не зря подготовили эту статью. Вы получите 0. Обратите внимание, что "1" имеет тип int и при сдвиге на 32 позиции произойдет переполнение, как показано на рисунке 2. ![]() Рисунок 2. Вычисление выражения "ptrdiff_t mask = 1 << bitNum". Для исправления кода необходимо сделать константу "1" того же типа, что и переменная mask.
или
Еще один вопрос. Чему будет равен результат вызова неисправленной функции SetBitN(0, 31)? Правильный ответ 0xffffffff80000000. Результатом выражения 1 << 31 является отрицательное число -2147483648. Это число представляется в 64-битной целой переменной как 0xffffffff80000000. Следует помнить и учитывать эффекты сдвига значений различных типов. .... www.Viva64.com --------------------
Карпов Андрей, DevRel в PVS-Studio. |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |