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, Супермодераторы



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

Сейчас этот форум просматривают: worm2


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

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