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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> >>, Что означает эта запись?
Сергей Борщ
сообщение Jul 24 2009, 08:08
Сообщение #16


Гуру
******

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



Цитата(Xenia @ Jul 24 2009, 10:53) *
Думаете, что 0x00C0 другое число? - Нет, то же самое!
Если речь шла о знаковой переменной размером 1 байт, то 0x00C0 - действительно другое число. Да, при выполнении арифметических операций стандарт требует приведения меньших типов к размерности (unsigned)int. Но правило приведения знаковых типов как раз требует расширения знакового бита на добавляемые старшие разряды. Так что "тем же" будет число 0xFFC0.


--------------------
На любой вопрос даю любой ответ
"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
Dreamer
сообщение Jul 24 2009, 08:14
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154



Цитата
С чего бы вдруг 0xC0 быть байтом?


С того, что его можно объявить как signed char. Мой пример именно для signed char.

Цитата
Константы такого рода считаются, как int-значения, а не char. А int это обычно 2 байта, а не один.

Не-а. Обычно длина типа int соответствует разрядности процессора, для которого сделан компилятор.
Для 32разрядных int будет 4 байта, для 16разрядных - 2 байта.

Константы, явно заданные в выражении, действительно являются типом int.
Я оговорился и не написал, что пример придназначен для типа signed char.

Цитата
А потому 0xC0 >> 2 == 0x30

Хорошо. Тогда пример специально для Вас: wink.gif

0хС000 >> 2 == 0xF000 (Конкретно для знакового 2байтового типа).




Вот вам еще пример кода:
Код
    char c = 0xC0;
    int i = c;
    i>>=2;

char и int в настройках компилятора стоят как знаковые.
Как вы думаете, чему будет равно i после выполнения кода? Думаете, 0x0030?
Не-а. Результат будет равен 0хFFF0.
wink.gif


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jul 24 2009, 08:28
Сообщение #18


Гуру
******

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



Если это char, да еще и знаковый, то возражений у меня нет. Я же имела в виду, что выражение
if (0xC0 >> 2 == 0xF0)
было бы расценено IAR-компилятором как ложное, а
if (0xC0 >> 2 == 0x30)
как истинное.

P.S. IAR-компилятор для AVR8 понимает int, как двухбайтное знаковое целое, несмотря на то, что регистры имеют разрядность один байт.
Go to the top of the page
 
+Quote Post
Dreamer
сообщение Jul 24 2009, 08:39
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154



Цитата
Если это char, да еще и знаковый, то возражений у меня нет. Я же имела в виду, что выражение
if (0xC0 >> 2 == 0xF0)
было бы расценено IAR-компилятором как ложное


Ну у меня возражений тоже нет wink.gif
Я написал-то пример не к словам о приведению типов, а к высказанному в этой ветке мнению, что сдвиг вправо у отрицательных чисел непредсказуем. А правило тем-не менее есть и оно стандартное.

Цитата
P.S. IAR-компилятор для AVR8 понимает int, как двухбайтное знаковое целое, несмотря на то, что регистры имеют разрядность один байт.

Да, для Keil51 у int тоже два байта, хотя процессор там восьмиразрядный.
Это не вяжется с тем правилом, котрое я процетировал, но я его видел в литературе очень много раз.


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th August 2025 - 12:35
Рейтинг@Mail.ru


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