|
32-битную переменную не получается заполнить двоичными единичками, Работаю в SDK от Xilinx, это допиленный Eclipse, компилятор GCC |
|
|
|
Dec 25 2014, 03:15
|

Гуру
     
Группа: Свой
Сообщений: 2 002
Регистрация: 17-01-06
Из: Томск, Россия
Пользователь №: 13 271

|
Здравствуйте. Работаю в 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, но вопрос принципиальный, как заставить?
--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
|
|
|
|
|
Dec 25 2014, 03:27
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(Krys @ Dec 25 2014, 06:15)  Здравствуйте. Работаю в 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), то ставьте его перед единичкой, которую сдвигаете влево, т.к. после сдвига это делать поздно - старший знак уже пропал. Вы проявляете непонимание, свойственное начинающим С-программистам, которые частенько забывают, что приводить операнды к требуемому типу следует ДО операции. Поскольку, если значащие разряды окажутся из-за переполнения потерянными, то переопределением результата к другому типу назад их уже не вернуть.
|
|
|
|
|
Dec 25 2014, 04:49
|

Гуру
     
Группа: Свой
Сообщений: 2 002
Регистрация: 17-01-06
Из: Томск, Россия
Пользователь №: 13 271

|
Да, всё сработало, большое спасибо. Понимание-то я проявляю, тут скорее забывание про эту одну единственную единичку. Видите: я остальные операнды расширил, даже правую единичку, а эту забыл )) Через ухо там несильно сложно, по-настоящему можно написать u64, и поймёт. А unsigned long long это я записал для каноничности, чтобы не было подозрений, что где-то u64 объявлен криво.
--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
|
|
|
|
|
Dec 25 2014, 05:13
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Скажите, понимает ли ваш компилятор определения числовых констант с суффиксом: 1i64 или 1LL А то Microsoft пишет в документе " C++ Integer Constants", что такие суффиксы в Visual Studio 2013 допустимы. Как в этом отношении ведет себя GCC? А то бы очень классно выглядело выражение типа (1i64 << 32) без явного переопределения типа.
|
|
|
|
|
Dec 25 2014, 13:43
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
А можно узнать подробней о версии gcc? Вот результат выражения из первого поста http://ideone.com/tM7rbCНу и вот без лишнего приведения типов http://ideone.com/xqRct2
|
|
|
|
|
Dec 26 2014, 03:18
|

Гуру
     
Группа: Свой
Сообщений: 2 002
Регистрация: 17-01-06
Из: Томск, Россия
Пользователь №: 13 271

|
Цитата(den_po @ Dec 25 2014, 19:43)  А можно узнать подробней о версии 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. Цитата(scifi @ Dec 25 2014, 20:53)  Кстати, да. Ведь вполне ожидаемо, что "(unsigned)-1" даст 0xFFFFFFFF. Хм... действительно, если разобраться, странно... Даже если у меня 32-битная единичка, я её сдвинул за пределы разрядной сетки, получил ноль. Потом единичку отнимаю от нуля. Получаю 0xFFFFFFFF. Косяк ещё и в том, что обычно компилятор давал ворнинг, что сдвигание привело к выходу за пределы разрядной сетки. А в этом случае не поругался.
--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
|
|
|
|
|
Dec 26 2014, 08:25
|

Гуру
     
Группа: Свой
Сообщений: 2 002
Регистрация: 17-01-06
Из: Томск, Россия
Пользователь №: 13 271

|
Цитата(scifi @ Dec 26 2014, 13:29)  Если это так, то компилятор глючный донельзя :-) А у ксайлинкса есть какие-то продукты без такого свойства? ))) Там же написано NO WARRANTY ))) Да, догадка подтвердилась. Код Код unsigned int max_per = 0, min_per = (1<<34) - 1; даёт троечку )))
--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
|
|
|
|
|
Dec 26 2014, 08:44
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Krys @ Dec 26 2014, 11:25)  Да, догадка подтвердилась. Код Код unsigned int max_per = 0, min_per = (1<<34) - 1; даёт троечку ))) Фигасе. Это точно gcc? Запускается на ПК? А исходники у него есть?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|