Перейти к содержанию
    

32-битную переменную не получается заполнить двоичными единичками

Здравствуйте. Работаю в SDK от Xilinx, это допиленный Eclipse, компилятор GCC.

У меня 32-битную переменную не получается заполнить двоичными единичками. Код такой:

    unsigned int max_per = 0, min_per =
            (unsigned int)((unsigned long long)(1<<32)-(unsigned long long)1);

даёт ноль. Если сдвиг на 31, то единички есть, но 31 штука. Пробовал без преобразования типов - тоже ноль. Короче никак не могу его заставить.

Я понимаю, что можно просто записать 0xFFFFFFFF, но вопрос принципиальный, как заставить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте. Работаю в SDK от Xilinx, это допиленный Eclipse, компилятор GCC.

У меня 32-битную переменную не получается заполнить двоичными единичками. Код такой:

    unsigned int max_per = 0, min_per =
            (unsigned int)((unsigned long long)(1<<32)-(unsigned long long)1);

даёт ноль. Если сдвиг на 31, то единички есть, но 31 штука. Пробовал без преобразования типов - тоже ноль. Короче никак не могу его заставить.

Я понимаю, что можно просто записать 0xFFFFFFFF, но вопрос принципиальный, как заставить?

 

Вот и запишите "по-простому" 0xFFFFFFFF :). А если хотите через ухо (unsigned long long), то ставьте его перед единичкой, которую сдвигаете влево, т.к. после сдвига это делать поздно - старший знак уже пропал.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, всё сработало, большое спасибо. Понимание-то я проявляю, тут скорее забывание про эту одну единственную единичку. Видите: я остальные операнды расширил, даже правую единичку, а эту забыл ))

Через ухо там несильно сложно, по-настоящему можно написать u64, и поймёт. А unsigned long long это я записал для каноничности, чтобы не было подозрений, что где-то u64 объявлен криво.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скажите, понимает ли ваш компилятор определения числовых констант с суффиксом:

1i64

или

1LL

А то Microsoft пишет в документе "C++ Integer Constants", что такие суффиксы в Visual Studio 2013 допустимы. Как в этом отношении ведет себя GCC?

 

А то бы очень классно выглядело выражение типа

(1i64 << 32)

без явного переопределения типа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо и за эти подсказки.

1i64 - не понимает такой синтаксис.

1LL - работает правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно узнать подробней о версии gcc?

 

Вот результат выражения из первого поста http://ideone.com/tM7rbC

Ну и вот без лишнего приведения типов http://ideone.com/xqRct2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот результат выражения из первого поста http://ideone.com/tM7rbC

Ну и вот без лишнего приведения типов http://ideone.com/xqRct2

Кстати, да. Ведь вполне ожидаемо, что "(unsigned)-1" даст 0xFFFFFFFF.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно узнать подробней о версии gcc?

c:\Xilinx\14.7\ISE_DS\EDK\gnu\microblaze\nt\bin>mb-gcc --version
mb-gcc (GCC) 4.6.4 20120924 (Xilinx 14.1 Build EDK_P.13 28 Sep 2013)
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

 

Кстати, да. Ведь вполне ожидаемо, что "(unsigned)-1" даст 0xFFFFFFFF.
Хм... действительно, если разобраться, странно... Даже если у меня 32-битная единичка, я её сдвинул за пределы разрядной сетки, получил ноль. Потом единичку отнимаю от нуля. Получаю 0xFFFFFFFF. Косяк ещё и в том, что обычно компилятор давал ворнинг, что сдвигание привело к выходу за пределы разрядной сетки. А в этом случае не поругался.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть мысль: может просто сдвиг циклический? Тогда всё сходится. Единичка сдвинутая на 32 разряда попадает на своё прежнее место, отнимаем единичку получаем ноль. Пока проверить не могу, позже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть мысль: может просто сдвиг циклический?

Если это так, то компилятор глючный донельзя :-)

Этого просто не может быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если это так, то компилятор глючный донельзя :-)
А у ксайлинкса есть какие-то продукты без такого свойства? )))

Там же написано NO WARRANTY )))

 

Да, догадка подтвердилась. Код

    unsigned int max_per = 0, min_per = (1<<34) - 1;

даёт троечку )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, догадка подтвердилась. Код

    unsigned int max_per = 0, min_per = (1<<34) - 1;

даёт троечку )))

Фигасе. Это точно gcc? Запускается на ПК? А исходники у него есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...