реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> 32-битную переменную не получается заполнить двоичными единичками, Работаю в SDK от Xilinx, это допиленный Eclipse, компилятор GCC
Krys
сообщение Dec 25 2014, 03:15
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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, но вопрос принципиальный, как заставить?


--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 25 2014, 03:27
Сообщение #2


Гуру
******

Группа: Модератор 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 sm.gif. А если хотите через ухо (unsigned long long), то ставьте его перед единичкой, которую сдвигаете влево, т.к. после сдвига это делать поздно - старший знак уже пропал.

Вы проявляете непонимание, свойственное начинающим С-программистам, которые частенько забывают, что приводить операнды к требуемому типу следует ДО операции. Поскольку, если значащие разряды окажутся из-за переполнения потерянными, то переопределением результата к другому типу назад их уже не вернуть.
Go to the top of the page
 
+Quote Post
Krys
сообщение Dec 25 2014, 04:49
Сообщение #3


Гуру
******

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



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


--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 25 2014, 05:13
Сообщение #4


Гуру
******

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



Скажите, понимает ли ваш компилятор определения числовых констант с суффиксом:
1i64
или
1LL
А то Microsoft пишет в документе "C++ Integer Constants", что такие суффиксы в Visual Studio 2013 допустимы. Как в этом отношении ведет себя GCC?

А то бы очень классно выглядело выражение типа
(1i64 << 32)
без явного переопределения типа.
Go to the top of the page
 
+Quote Post
Krys
сообщение Dec 25 2014, 07:53
Сообщение #5


Гуру
******

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



Спасибо и за эти подсказки.
1i64 - не понимает такой синтаксис.
1LL - работает правильно.


--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 25 2014, 08:28
Сообщение #6


Гуру
******

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



Код
uint32_t min_per = ~(uint32_t)0;


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Krys
сообщение Dec 25 2014, 10:14
Сообщение #7


Гуру
******

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



тоже идея ))


--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
Go to the top of the page
 
+Quote Post
den_po
сообщение Dec 25 2014, 13:43
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



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

Вот результат выражения из первого поста http://ideone.com/tM7rbC
Ну и вот без лишнего приведения типов http://ideone.com/xqRct2
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 25 2014, 14:53
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(den_po @ Dec 25 2014, 16:43) *
Вот результат выражения из первого поста http://ideone.com/tM7rbC
Ну и вот без лишнего приведения типов http://ideone.com/xqRct2

Кстати, да. Ведь вполне ожидаемо, что "(unsigned)-1" даст 0xFFFFFFFF.
Go to the top of the page
 
+Quote Post
Krys
сообщение Dec 26 2014, 03:18
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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. Косяк ещё и в том, что обычно компилятор давал ворнинг, что сдвигание привело к выходу за пределы разрядной сетки. А в этом случае не поругался.


--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
Go to the top of the page
 
+Quote Post
Krys
сообщение Dec 26 2014, 07:02
Сообщение #11


Гуру
******

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



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


--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 26 2014, 07:29
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Krys @ Dec 26 2014, 10:02) *
есть мысль: может просто сдвиг циклический?

Если это так, то компилятор глючный донельзя :-)
Этого просто не может быть.
Go to the top of the page
 
+Quote Post
den_po
сообщение Dec 26 2014, 07:39
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Такое бывает, к сожалению
Go to the top of the page
 
+Quote Post
Krys
сообщение Dec 26 2014, 08:25
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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;

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


--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 26 2014, 08:44
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Krys @ Dec 26 2014, 11:25) *
Да, догадка подтвердилась. Код
Код
    unsigned int max_per = 0, min_per = (1<<34) - 1;

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

Фигасе. Это точно gcc? Запускается на ПК? А исходники у него есть?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 10:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01518 секунд с 7
ELECTRONIX ©2004-2016