Krys 2 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба Здравствуйте. Работаю в 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, но вопрос принципиальный, как заставить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 36 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба Здравствуйте. Работаю в 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), то ставьте его перед единичкой, которую сдвигаете влево, т.к. после сдвига это делать поздно - старший знак уже пропал. Вы проявляете непонимание, свойственное начинающим С-программистам, которые частенько забывают, что приводить операнды к требуемому типу следует ДО операции. Поскольку, если значащие разряды окажутся из-за переполнения потерянными, то переопределением результата к другому типу назад их уже не вернуть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба Да, всё сработало, большое спасибо. Понимание-то я проявляю, тут скорее забывание про эту одну единственную единичку. Видите: я остальные операнды расширил, даже правую единичку, а эту забыл )) Через ухо там несильно сложно, по-настоящему можно написать u64, и поймёт. А unsigned long long это я записал для каноничности, чтобы не было подозрений, что где-то u64 объявлен криво. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 36 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба Скажите, понимает ли ваш компилятор определения числовых констант с суффиксом: 1i64 или 1LL А то Microsoft пишет в документе "C++ Integer Constants", что такие суффиксы в Visual Studio 2013 допустимы. Как в этом отношении ведет себя GCC? А то бы очень классно выглядело выражение типа (1i64 << 32) без явного переопределения типа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба Спасибо и за эти подсказки. 1i64 - не понимает такой синтаксис. 1LL - работает правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба uint32_t min_per = ~(uint32_t)0; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба тоже идея )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den_po 0 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба А можно узнать подробней о версии gcc? Вот результат выражения из первого поста http://ideone.com/tM7rbC Ну и вот без лишнего приведения типов http://ideone.com/xqRct2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 25 декабря, 2014 Опубликовано 25 декабря, 2014 · Жалоба Вот результат выражения из первого поста http://ideone.com/tM7rbC Ну и вот без лишнего приведения типов http://ideone.com/xqRct2 Кстати, да. Ведь вполне ожидаемо, что "(unsigned)-1" даст 0xFFFFFFFF. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 26 декабря, 2014 Опубликовано 26 декабря, 2014 · Жалоба А можно узнать подробней о версии 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. Косяк ещё и в том, что обычно компилятор давал ворнинг, что сдвигание привело к выходу за пределы разрядной сетки. А в этом случае не поругался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 26 декабря, 2014 Опубликовано 26 декабря, 2014 · Жалоба есть мысль: может просто сдвиг циклический? Тогда всё сходится. Единичка сдвинутая на 32 разряда попадает на своё прежнее место, отнимаем единичку получаем ноль. Пока проверить не могу, позже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 26 декабря, 2014 Опубликовано 26 декабря, 2014 · Жалоба есть мысль: может просто сдвиг циклический? Если это так, то компилятор глючный донельзя :-) Этого просто не может быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den_po 0 26 декабря, 2014 Опубликовано 26 декабря, 2014 · Жалоба Такое бывает, к сожалению Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 26 декабря, 2014 Опубликовано 26 декабря, 2014 · Жалоба Если это так, то компилятор глючный донельзя :-)А у ксайлинкса есть какие-то продукты без такого свойства? ))) Там же написано NO WARRANTY ))) Да, догадка подтвердилась. Код unsigned int max_per = 0, min_per = (1<<34) - 1; даёт троечку ))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 26 декабря, 2014 Опубликовано 26 декабря, 2014 · Жалоба Да, догадка подтвердилась. Код unsigned int max_per = 0, min_per = (1<<34) - 1; даёт троечку ))) Фигасе. Это точно gcc? Запускается на ПК? А исходники у него есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться