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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> еще один вопрос ламерский по иару
SSerge
сообщение Mar 22 2010, 22:20
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Из стандарта языка:
C++ Standard ISO/IEC 14882:2003
2.13.1 Integer literals
The type of an integer literal depends on its form, value, and suffix. If it is decimal and has no suffix, it has
the first of these types in which its value can be represented: int, long int; if the value cannot be represented
as a long int, the behavior is undefined. If it is octal or hexadecimal and has no suffix, it has the
first of these types in which its value can be represented: int, unsigned int, long int, unsigned
long int. If it is suffixed by u or U, its type is the first of these types in which its value can be represented:
unsigned int, unsigned long int. If it is suffixed by l or L, its type is the first of these
types in which its value can be represented: long int, unsigned long int. If it is suffixed by ul,
lu, uL, Lu, Ul, lU, UL, or LU, its type is unsigned long int.


т.е. это указание что константа 1 имеет тип unsigned long int.
В данном конкретном случае это не важно, тип int у IAR для ARM и так 32-битный, а результат сдвига влево не зависит от знаковости операнда, но случаи - они разные бывают smile.gif


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 22 2010, 22:37
Сообщение #17


Гуру
******

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



Цитата(SSerge @ Mar 23 2010, 01:20) *
В данном конкретном случае это не важно, тип int у IAR для ARM и так 32-битный, а результат сдвига влево не зависит от знаковости операнда

Да? а как тогда компилятору трактовать сдвиг абстрактной 1 влево на 31, например:
unsigned long value = 1<<31;
Вменяемый компилятор должен предупредить, что пытаетесь присвоить получившиеся знаковое значение беззнаковой переменной,
если не скажете про беззаковость:
unsigned long value = 1UL<<31;


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SSerge
сообщение Mar 22 2010, 23:29
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Это да, про сдвиг на 31 я что-то сразу не сообразил.
Впрочем, по стандарту это не ошибка (int может быть преобразован в unsigned long), а только повод выдать предупреждение.
Что IAR и делает:
Warning[Pe068]: integer conversion resulted in a change of sign

А вот на такое уже не предупреждает, ибо не в состоянии отследить сомнительные значения:
extern int xxx;
unsigned long value = xxx+(1<<31);


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 23 2010, 07:06
Сообщение #19


Гуру
******

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



Цитата(induke @ Mar 23 2010, 00:05) *
эх как на асме хорошо было
Там не нужно было изучать язык ассемблера и документацию на конкретный ассемблер? Знание приходило свыше само?


--------------------
На любой вопрос даю любой ответ
"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 Текстовая версия Сейчас: 14th July 2025 - 00:15
Рейтинг@Mail.ru


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