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

 
 
> Анатомия регистра.
Злодей
сообщение Feb 15 2009, 07:44
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



cranky.gif Где у числа голова, какой байт в слове верхний, и как определять возраст разряда?

Большое спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Злодей
сообщение Feb 15 2009, 17:41
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Тогда определить MSB можно так:
#define MSB( X ) ( ( X & ( 1 << ( 8 * sizeof( X ) ) ) ) ? 1 : 0 )

если мы используем
#define MSB( X ) ( X & ( 1 << ( 8 * sizeof( X ) ) ) )
для какого-нибудь very long X с единицей в самом значащим бите, получим число из 1 и very long хвоста нулей. Хранить его не стоит, но можно использовать в логическом выражении.

Обращаю внимание (сам долго смотрел на пример и не замечал), как demiurg_spb отрезает переднюю часть несколько-байтового числа приведением к типу (unsigned char):

Цитата(demiurg_spb @ Feb 15 2009, 16:40) *
Код
#define BYTE0(X)            ((unsigned char)((X)>>0U))
#define BYTE1(X)            ((unsigned char)((X)>>8U))
#define BYTE2(X)            ((unsigned char)((X)>>16U))
#define BYTE3(X)            ((unsigned char)((X)>>24U))


Окончания U ... это ... помощь компилятору?

Сообщение отредактировал Злодей - Feb 15 2009, 17:51
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 15 2009, 21:17
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Злодей @ Feb 15 2009, 20:41) *
Окончания U ... это ... помощь компилятору?
В данном конкретном случае этого можно было и не делать (явно не указывать тип и размерность констант). Я просто привык (пару раз наступил на грабли) и считаю, что если ты знаешь тип и размерность константы (а знаешь ты это почти всегда) и она отлична от int или эта константа участвует в формуле, в которой возможен выход за диапазон типа int, то использование суффиксов U L UL f обязательно!
Цитата
Тогда определить MSB можно так:
#define MSB( X ) ( ( X & ( 1 << ( 8 * sizeof( X ) ) ) ) ? 1 : 0 )
так короче
Код
#define MSB(X) (((X)  &  (1 << (8*sizeof(X)))) != 0)
Поясню: результатом любой логической операции уже является числом 0 или 1. И также справедливо утверждение, что любое выражение само может быть объектом логической операции.
Поэтому, совершенно нормально и адекватно писать так:
Код
n = a + b - (y==x);
или даже так
Код
if ((a=b)) {...}
- тут происходит присвоение 'а' к 'б', а потом проверка на неравенство нулю результата выражения, т.е. (a!=0) (скобочки двойные, чтоб указать, что тут не опечатка и тут не имелось в виду а==b ).
Цитата
Обращаю внимание (сам долго смотрел на пример и не замечал)...

Вы бы лучше обратили внимание, на то, что аргументы передаваемые в макрос должны быть взяты в скобки в теле макроса.
Об этом во всех учебниках толдычат и не зря.
Почувствуйте разницу:
Код
#define GOOD_MACRO(X)  ((X)*(X))
#define BAD_MACRO(X)     (X*X)

static const int A = 1;
int a = GOOD_MACRO(A+1);   // результат = (A+1)*(A+1) = 2*2 = 4
int b = BAD_MACRO(A+1);    // результат = A+1*A+1 = 1+1+1 = 3


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 16:34
Рейтинг@Mail.ru


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