|
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, но вопрос принципиальный, как заставить?
--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 21)
|
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? Запускается на ПК? А исходники у него есть?
|
|
|
|
|
Dec 26 2014, 10:26
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(scifi @ Dec 26 2014, 09:29)  Если это так, то компилятор глючный донельзя :-) Как раз нет. Все в пределах стандарта: Цитата 3 The integer promotions are performed on each of the operands. The type of the result is that of the promoted left operand. If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined. "Незнание закона не освобождает от ответственности".
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|