2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 фрагменты _int64 [C]
Сообщение12.07.2018, 01:09 


07/10/15

2400
В типе int32 предусмотрена возможность работы с фрагментами,
так можно объединить два числа short в одно int32

Используется синтаксис C
DWORD MAKELONG(
   WORD wLow,
   WORD wHigh
);
 


Можно так же обращаться к его фрагментам, например к старшему слову
Используется синтаксис C
WORD HIWORD(
   DWORD dwValue
);
 


Есть ли что нибудь подобное для int64, позволяющее представить его как 2 фрагмента DWORD?

 Профиль  
                  
 
 Re: фрагменты _int64
Сообщение12.07.2018, 01:34 
Аватара пользователя


07/01/13
261
NJ
Код:
#define MAKEWORD(a,b)   ((WORD)(((BYTE)(a))|(((WORD)((BYTE)(b)))<<8)))
#define MAKELONG(a,b)   ((LONG)(((WORD)(a))|(((DWORD)((WORD)(b)))<<16)))
#define LOWORD(l)   ((WORD)((DWORD)(l)))
#define HIWORD(l)   ((WORD)(((DWORD)(l)>>16)&0xFFFF))
#define LOBYTE(w)   ((BYTE)(w))
#define HIBYTE(w)   ((BYTE)(((WORD)(w)>>8)&0xFF))

Можно написать свой макрос по аналогии.

 Профиль  
                  
 
 Re: фрагменты _int64
Сообщение12.07.2018, 01:59 


07/10/15

2400
Используется синтаксис C
#define MAKEDLONG(a,b)   ((_int64)(((long int)(a))|(((_int64)((long int)(b)))<<32)))

#define HIVAL(l)   ((long int)(((_int64)(l))>>32)&0xFFFFFFFF)
#define LOVAL(l)   ((long int)((_int64)(l)))
 


Corund правильно?

 Профиль  
                  
 
 Re: фрагменты _int64
Сообщение12.07.2018, 15:23 


07/10/15

2400
Выяснилось, что правильно будет вот так:

Используется синтаксис C
#define MAKEDLONG(a,b)   ((_int64)(((long int)(a)&0xFFFFFFFF)|(((_int64)((long int)(b)))<<32)))

#define HIVAL(l)   ((long int)(((_int64)(l))>>32)&0xFFFFFFFF)
#define LOVAL(l)   ((long int)((_int64)(l)))
 


иначе, если "a" со знаком "-", то "b" прочитать правильно уже не получится. Это видимого от того, что в доп. коде у отрицательного числа все старшие биты "true" и они затирают число "b", при его чтении всегда получается "-1", это как раз 0xFFFFFFFF.

 Профиль  
                  
 
 Re: фрагменты _int64
Сообщение12.07.2018, 16:25 
Аватара пользователя


07/01/13
261
NJ
Ну это зависит от того, что именно Вам нужно было.
Я предполагал только беззнаковые 32 и 64 битные целые числа (другие типы будут принудительно приводится к этим - тут уже нужно самому следить).
Код:
typedef QWORD __uint64_t; //unsigned 64-bit integer
typedef DWORD __uint32_t; //unsigned 32-bit integer

// QWORD MAKEQWORD(DWORD, DWORD);
// DWORD LDWORD(QWORD);
// DWORD HDWORD(QWORD);

#define MAKEQWORD(a,b)   ((QWORD)(((DWORD)(a))|(((QWORD)((DWORD)(b)))<<32)))
#define LDWORD(l)   ((DWORD)(l))
#define HDWORD(l)   ((DWORD)(((QWORD)(l)>>32) & 0xFFFFFFFF))

 Профиль  
                  
 
 Re: фрагменты _int64
Сообщение12.07.2018, 17:31 


07/10/15

2400
Corund в сообщении #1326252 писал(а):
Код:
QWORD MAKEQWORD(DWORD, DWORD);
DWORD LDWORD(QWORD);
DWORD HDWORD(QWORD);


Да, вот про это я и спрашивал.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group