Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: работа с unsigned long
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
st_user
Подскажите пожалуйста, какие настройки компилтятора необходимо задать, чтобы он заработал с типом unsigned long согласно стандарту ANSI C.

И вообще, такой вопрос: может ли нормально работать компилятор с этими переменными. Например если я сдвигаю из младшего слова в старшее? Не будет ли что-нибудь потеряно?
ozzy
уточните какой у Вас компилятор и саму проблему
(обычно компиляторы нормально переносят и unsigned и long и то и другое вместе)
Oldring
Цитата(st_user @ Apr 30 2007, 12:50) *
Подскажите пожалуйста, какие настройки компилтятора необходимо задать, чтобы он заработал с типом unsigned long согласно стандарту ANSI C.

И вообще, такой вопрос: может ли нормально работать компилятор с этими переменными. Например если я сдвигаю из младшего слова в старшее? Не будет ли что-нибудь потеряно?


Какой именно компилятор?
Если компилятор не поддерживает unsigned long - он очень нестандартный wink.gif Лучше выберите другой компилятор.
zltigo
Цитата(st_user @ Apr 30 2007, 11:50) *
Подскажите пожалуйста, какие настройки компилтятора необходимо задать, чтобы он заработал с типом unsigned long согласно стандарту ANSI C.

Никаких.
Цитата
И вообще, такой вопрос: может ли нормально работать компилятор с этими переменными.

Без малейших проблем.
Цитата
Например если я сдвигаю из младшего слова в старшее? Не будет ли что-нибудь потеряно?

В "C" сдвиги не циклические, по этой причине содержимое старших битов сдвинится "в никуда" будет "потеряно". Аналогичная ситуация при сдвигах и 8/16/64bit переменных.

Стоит почитать Керниган & Ритчи. Книжечка есть везде. Тоненькакя.
st_user
Компилятор у меня IAR Atmel AVR C/EC++ Compiler V3.20C/W32.



А ещё такой вопрос: как компилятор понимает символ ^. Конечно, согласно стандарту Си это XOR, но может ли быть, что этот символ будет пониматься компилятором, к примеру, для доступа в регистры? Спасибо.

А проблема то похоже не в unsigned long, а в операторе ^, т.к. такую строку :

Код
v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);


компилятор нормально кушает только до первого символа ^.
zltigo
Цитата(st_user @ Apr 30 2007, 13:27) *
А проблема то похоже не в unsigned long, а в операторе ^, т.к. такую строку :
Код
v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);

компилятор нормально кушает только до первого символа ^.

Сдается мне, что Вы просто сами запутались в битовых операциях sad.gif и неправильно выразили свою мысль компилятору. Само выражение, с точки зрения компилятора, проблем доставлять не должно никаких. Хотя, если если в выражении используется смесь long/не long и warnigs игнорируются, то вполне можете где-то элементарно точность потерять.
st_user
Цитата(zltigo @ Apr 30 2007, 14:48) *
Сдается мне, что Вы просто сами запутались в битовых операциях sad.gif и неправильно выразили свою мысль компилятору. Само выражение, с точки зрения компилятора, проблем доставлять не должно никаких. Хотя, если если в выражении используется смесь long/не long и warnigs игнорируются, то вполне можете где-то элементарно точность потерять.


Думаю что не запутался, потому что я проверил этот код в Visual Studio, всё нормально работает, а вот компилятор для AVR контроллера не понимает.

Точнее сам компилятор для AVR контроллера понимает строку, но вот программа не работает в контроллере.
rezident
Не уверен, что это абсолютно правильно, но при операциях с long в ИАР я предпочитаю явно приводить все типы переменных и констант в выражении к long-у. Не зная типов переменных, участвующих в выражении, я бы написал все же так
Код
v0 += ((((unsigned long)v1<<4UL) + k0) ^ ((unsigned long)v1 + sum) ^ (((unsigned long)v1>>5UL) + (unsigned long)k1));

Или сделал бы может не столь наглядно, но проще, разбив сложную операцию, на более простые. По крайней мере советую в ИАР явно указывать тип констант суффиксами L(long) и UL(unsigned long).
zltigo
Цитата(rezident @ Apr 30 2007, 14:51) *
Не уверен

Ну переменные, нежели они уже unsigned long совершенно незачем, если не unsigned long - тоже с разбором. А вот константы, которые int по умолчанию (а на AVR int, полагаю, 16bit) - надо. В параллельной ветке Автор конкретный контекст приводил, там я это и подправил.
Dog Pawlowa
Наблюдал "неодинаковость" работы IAR AVR и ICCAVR при работе с long. Сдвиг в принципе был, поскольку это было чтение из ADC высокой точности, в 16 бит не помещалось. Рабочий текст переносился с IAR на ICC из-за религиозных убеждений заказчика (пункт "Не укради!")
Не разбирался и разбираться не буду, так фирма клиента разорилась (жаба душила на IAR, вот и погорели smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.