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

 
 
> >>, Что означает эта запись?
niktagor
сообщение Jul 1 2009, 16:01
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 24-06-09
Пользователь №: 50 601



Братцы, я с языком си знаком слабовато. Что означает вот эта запись? Подскажите пожалуйста.

*pDMA_DBP = (unsigned short)((unsigned int)sSPORT0_TX_Descriptor >> 16);
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dreamer
сообщение Jul 24 2009, 07:38
Сообщение #2


Участник
*

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



Цитата
Если следовать стандарту, то получается, что отрицательные вообще нельзя сдвигать, так как результат непредсказуем. Тем не менее все компиляторы, имеющиеся у меня под рукой, выдали результат:

Результат предсказуем как грабли и прописан в стандарте wink.gif

В языке С для операции правого сдвига для знаковых типов есть определенное правило.
Если старший бит равен нулю, то левые поля заполняются нулями.
Если старший бит равен единице, то поля заполняются единицами.

Отсюда следствие - положительные числа сдвигаются "как есть", а отрицательные числа, поскольку имеют в старшем бите единицу, сдвигаются вправо с заполнением единицей.
Пример:
0х40 >> 2 == 0x10;
0xC0 >> 2 == 0xF0;

0хС0 в десятичном представлении для знакового типа - это -64, а 0xF0 - это -16.


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


Гуру
******

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



Цитата(Dreamer @ Jul 24 2009, 10:38) *
Отсюда следствие - положительные числа сдвигаются "как есть", а отрицательные числа, поскольку имеют в старшем бите единицу, сдвигаются вправо с заполнением единицей.
Пример:
0х40 >> 2 == 0x10;
0xC0 >> 2 == 0xF0;

С чего бы вдруг 0xC0 быть байтом? Запись 0xC0 означает лишь шестандцатеричную форму записи, но никак не ограничение одним байтом. Думаете, что 0x00C0 другое число? - Нет, то же самое!
Константы такого рода считаются, как int-значения, а не char. А int это обычно 2 байта, а не один. Причем даже для 8-битных микропроцессоров (AVR). Поэтому старший бит у этого числа нулевой. А потому
0xC0 >> 2 == 0x30;
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 24 2009, 08:08
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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

Сообщений в этой теме
- niktagor   >>   Jul 1 2009, 16:01
- - rezident   Переменная sSPORT0_TX_Descriptor приводится к типу...   Jul 1 2009, 16:59
|- - niktagor   Спасибо, все понял!   Jul 2 2009, 07:51
|- - demiurg_spb   То, что понял - это хорошо! Но очень полезно С...   Jul 2 2009, 09:20
- - defunct   >> - обозначает сдвиг вправо. x >> n ...   Jul 1 2009, 23:42
|- - rezident   Цитата(defunct @ Jul 2 2009, 05:42) Всегд...   Jul 2 2009, 09:50
|- - 777777   Цитата(defunct @ Jul 2 2009, 03:42) >...   Jul 2 2009, 10:30
|- - defunct   Цитата(777777 @ Jul 2 2009, 13:30) Правил...   Jul 2 2009, 12:12
|- - 777777   Цитата(defunct @ Jul 2 2009, 16:12) Cобсн...   Jul 3 2009, 10:44
|- - defunct   Цитата(777777 @ Jul 3 2009, 13:44) Так чт...   Jul 3 2009, 14:29
|- - 777777   Цитата(defunct @ Jul 3 2009, 18:29) Разни...   Jul 3 2009, 17:21
- - DpInRock   >> в Сях - это деление на степень двойки. Во...   Jul 2 2009, 02:16
- - DpInRock   ЦитатаВот так проще всего описать. Ключевое слово....   Jul 2 2009, 11:02
- - Dreamer   ЦитатаС чего бы вдруг 0xC0 быть байтом? С того, ч...   Jul 24 2009, 08:14
|- - Xenia   Если это char, да еще и знаковый, то возражений у ...   Jul 24 2009, 08:28
- - Dreamer   ЦитатаЕсли это char, да еще и знаковый, то возраже...   Jul 24 2009, 08:39


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:35
Рейтинг@Mail.ru


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