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

 
 
> 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
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 21)
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
Krys
сообщение Dec 26 2014, 08:48
Сообщение #16


Гуру
******

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



Ну вот посмотрите в сообщении #10 информацию о версии. Работает на железе. Встраиваемый софтовый проц на ПЛИС. Исходников наверное нет... Т.к. он допилен компанией Xilinx под свои продукты.


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


Гуру
******

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



Цитата(Krys @ Dec 26 2014, 11:48) *
Работает на железе. Встраиваемый софтовый проц на ПЛИС.

А, ну если на железе, тогда другое дело. В конце концов, даже в софтовом проце можно инструкции сдвига поменять или просто перепутать, а в исходниках компилятора напортачить ещё проще :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 26 2014, 10:26
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Krys
сообщение Dec 26 2014, 10:50
Сообщение #19


Гуру
******

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



Цитата(Сергей Борщ @ Dec 26 2014, 16:26) *
the behavior is undefined.
Стандарт на неопределённость поведения )))


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


Гуру
******

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



Цитата(Сергей Борщ @ Dec 26 2014, 13:26) *
Как раз нет. Все в пределах стандарта:

"Незнание закона не освобождает от ответственности".

Тады ой.
Go to the top of the page
 
+Quote Post
WitFed
сообщение Dec 26 2014, 13:16
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 271
Регистрация: 6-12-11
Из: Taganrog
Пользователь №: 68 701



А я в последнее время для FFFFFFFF пишу = 0-1, это короче, и никто варнингов почему-то не выдаёт.
Но ~0 ещё короче. Или я что-то не так понял в условиях ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 26 2014, 14:04
Сообщение #22


Гуру
******

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



Цитата(WitFed @ Dec 26 2014, 15:16) *
Или я что-то не так понял в условиях ?
На некоторых архитектурах, на которых int 16-битный, выражение uint32_t min_per = 0 - 1; (хотя 0 здесь лишний, просто -1 дает тот же результат) присвоит min_per значение 0x0000FFFF. Наверное самым коротким и правильным была бы запись uint32_t min_per = -(uint32_t)1;


--------------------
На любой вопрос даю любой ответ
"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

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 12:04
Рейтинг@Mail.ru


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