Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2009, 16:57   #1
Malkovich
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 16
По умолчанию Вопрос по LOWORD и HIWORD

code:

int main()
{

unsigned _int32 i = LOWORD(LOBYTE(0x1FF));// i = 255
unsigned _int32 j = LOWORD(HIBYTE(0x1FF));//j = 1

unsigned _int32 i_1 = LOWORD(0x1FFFF);//i_1 = 65535
unsigned _int32 j_1 = HIWORD(0x1FFFF);//j_1 = 1

unsigned _int32 i_2 = HIWORD(LOBYTE(0x1FFFF));// почему i_2= 0?
// когда по логике должно = 1
unsigned _int32 j_2 = HIWORD(HIBYTE(0x1FFFFFF));// а здесь ?
// почему j_2 = 0 хотя по логике должно = 1
return 0;
}

Заранее сенька.
Malkovich вне форума Ответить с цитированием
Старый 05.08.2009, 19:52   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

потому что компилятор раскрывает скобки изнутри наружу
LOBYTE(0x1FFFF)=0x000000ff
HIWORD(0x000000ff)=0
аналогично и j_2
сделай лучше так:
Цитата:
unsigned _int32 i_2 = LOBYTE(0x1FFFF>>16);// почему i_2= 0?
// когда по логике должно = 1
unsigned _int32 j_2 = HIBYTE(0x1FFFFFF>>16));// а здесь ?
// почему j_2 = 0 хотя по логике должно = 1
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 05.08.2009, 23:22   #3
Malkovich
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 16
По умолчанию дополнение

alexcoderу сенька за ответ.
я постигаю АЗЫ API;
Не хочу новой темы открывать:
обясните кто захочет я не одуплю след.
код:
int main()
{
unsigned short x = 1;
printf("%s\n", *((unsigned char *) &x) == 0 ? "big-endian" : "little- endian");
return 0;
}
как это понять: *((unsigned char *) &x)
смысл кода узнать тип расположения байтов.
Malkovich вне форума Ответить с цитированием
Старый 06.08.2009, 00:06   #4
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

сначала прочитай http://ru.wikipedia.org/wiki/Порядок_байтов
Так вот в интеловской архитектуре переменная будет располагаться в памати в следующем виде: 0x01, 0x00(little-endian), а SPARKе: 0x00, 0x01(big-endian)
Так вот
(unsigned char *) &x - это приведение переменной x к типу массива элементов unsigned char. Этот массив будет содержать последовательность либо 0x01, 0x00 либо 0x00, 0x01.
а первая * - это обращение к первому элементу массива через указатель. Если не нравятся указатели, можно обратиться через индекс массива:
printf("%s\n", ((unsigned char *) &x)[0] == 0 ? "big-endian" : "little- endian");
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 06.08.2009, 00:25   #5
Malkovich
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 16
По умолчанию re

исчерпывающий ответ СЕНЬКА alexcoderу
Malkovich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10
Вопрос по VS C++ Arthur Общие вопросы C/C++ 2 19.01.2008 18:34
Borland C++ не хочет видеть тип String? SERGOO Общие вопросы C/C++ 3 10.06.2007 12:37