|
|
  |
работа с unsigned long |
|
|
|
Apr 30 2007, 11:50
|
Группа: Новичок
Сообщений: 6
Регистрация: 29-04-07
Пользователь №: 27 409

|
Подскажите пожалуйста, какие настройки компилтятора необходимо задать, чтобы он заработал с типом unsigned long согласно стандарту ANSI C.
И вообще, такой вопрос: может ли нормально работать компилятор с этими переменными. Например если я сдвигаю из младшего слова в старшее? Не будет ли что-нибудь потеряно?
|
|
|
|
|
Apr 30 2007, 12:26
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(st_user @ Apr 30 2007, 11:50)  Подскажите пожалуйста, какие настройки компилтятора необходимо задать, чтобы он заработал с типом unsigned long согласно стандарту ANSI C. Никаких. Цитата И вообще, такой вопрос: может ли нормально работать компилятор с этими переменными. Без малейших проблем. Цитата Например если я сдвигаю из младшего слова в старшее? Не будет ли что-нибудь потеряно? В "C" сдвиги не циклические, по этой причине содержимое старших битов сдвинится "в никуда" будет "потеряно". Аналогичная ситуация при сдвигах и 8/16/64bit переменных. Стоит почитать Керниган & Ритчи. Книжечка есть везде. Тоненькакя.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 30 2007, 13:27
|
Группа: Новичок
Сообщений: 6
Регистрация: 29-04-07
Пользователь №: 27 409

|
Компилятор у меня IAR Atmel AVR C/EC++ Compiler V3.20C/W32. А ещё такой вопрос: как компилятор понимает символ ^. Конечно, согласно стандарту Си это XOR, но может ли быть, что этот символ будет пониматься компилятором, к примеру, для доступа в регистры? Спасибо. А проблема то похоже не в unsigned long, а в операторе ^, т.к. такую строку : Код v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1); компилятор нормально кушает только до первого символа ^.
|
|
|
|
|
Apr 30 2007, 13:48
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(st_user @ Apr 30 2007, 13:27)  А проблема то похоже не в unsigned long, а в операторе ^, т.к. такую строку : Код v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1); компилятор нормально кушает только до первого символа ^. Сдается мне, что Вы просто сами запутались в битовых операциях  и неправильно выразили свою мысль компилятору. Само выражение, с точки зрения компилятора, проблем доставлять не должно никаких. Хотя, если если в выражении используется смесь long/не long и warnigs игнорируются, то вполне можете где-то элементарно точность потерять.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 30 2007, 13:57
|
Группа: Новичок
Сообщений: 6
Регистрация: 29-04-07
Пользователь №: 27 409

|
Цитата(zltigo @ Apr 30 2007, 14:48)  Сдается мне, что Вы просто сами запутались в битовых операциях  и неправильно выразили свою мысль компилятору. Само выражение, с точки зрения компилятора, проблем доставлять не должно никаких. Хотя, если если в выражении используется смесь long/не long и warnigs игнорируются, то вполне можете где-то элементарно точность потерять. Думаю что не запутался, потому что я проверил этот код в Visual Studio, всё нормально работает, а вот компилятор для AVR контроллера не понимает. Точнее сам компилятор для AVR контроллера понимает строку, но вот программа не работает в контроллере.
|
|
|
|
|
Apr 30 2007, 15:09
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(rezident @ Apr 30 2007, 14:51)  Не уверен Ну переменные, нежели они уже unsigned long совершенно незачем, если не unsigned long - тоже с разбором. А вот константы, которые int по умолчанию (а на AVR int, полагаю, 16bit) - надо. В параллельной ветке Автор конкретный контекст приводил, там я это и подправил.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|