الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال حوال الماكرو HIWORD & LOWORD ؟

مغلق
بدأه مبرمج مصرى في 23 مايو 2006 · 3 رد · 593 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

سؤالي باختصار حول الماكرو HIWORD و الماكرو LOWORD

#define LOWORD(l)		   ((WORD)(l))
#define HIWORD(l)		   ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))

حاولت ان افهم ما المقصود بهذه العملية لكني فشلت فارجو ايضاحها بشكل رياضي واضح بمعني اخر

كيف يتم استخراخ قيمتين عدديتين من رقم واحد باستخدامهم

وماهوعكس هذه العملية اي كيف يتم دمج قيمتين في رقم واحد واعادة فصلهم باستخدام الماكرو السابق ذكره

سؤال آخر

وجدت في دوال كثيرة وعلى سبيل المثال منهم الدالة GetFileSize

ان الدالة تقوم بارجاع قيمة تسمى القيمة الدنيا ويتم ارجاع قيمة اخرى في بارميتر تسمي القيمة العليا

وعلى حسب ما قرأته في الــ MSDN انه اذا زاد حجم الملف عن 4 جيجا بيت يتم جلب المساحة من خلال القيمة العليا مع القيمة الدنيا ولو كانت اقل من 4 جيجا فيتم ارجاعها في القيمة الدنيا فقط

فارجو ايضاح هذه النقطة وكيف يتم حسابها اذا زادحجم الملف عن 4 جيجا بيت كما ذكرت ولعلي لم اكن مخطأ الفهم فيما قرأته في الـ MSDN

اسف جداً على تكرار المشاركة بنفس السؤال فلا اعلم كيف ظهر مرتين ربما اخطأت وضغطت على زر اضافة المشاركة مرتين

تم تعديل هذه المشاركة بواسطة مبرمج مصرى في 23 مايو 2006 في 05:40

Eng.Mostafa Abd El Zaher
 
Embedded Systems Programmer
Computer Programmer
 
للاطلاع على اعمالنا في مختلف المجالات برجاء زيارة صفحتنا
 
 

https://www.facebook.com/EgyESD

Mostafa_Cool2001@Hotmail.com

00201005674650

#2

المتغير من النوع DWORD حجمه 32bits, الماكرو LOWORD كل اللى بيعمله إنه بيرجع أول 16bits (Low Bits) و علشان يعمل كدة بيعمل Cast إلى النوع WORD اللى حجمه 16bits بس.

Assume a variable DWORD d= 0x0002 0001
When casting to WORD, it takes only the first 16bits and throw the others -> result= 0x0001

HIWORD بقى العكس, بيرجع أخر 16bits (High Bits) و علشان يعمل كدة بيعمل shift right بمقدار 16bits علشان يخلى البيتس اللى هو عايزها فى الأول و بعدين يعمل AND مع عدد كله ones فى أول 16bits و بيعمل برضه كاست ل WORD علشان يرجع 16bits بس.

Assume also the same variable DWORD d= 0x0002 0001
After Shifting it to the right by 16bits it becomes like this -> _TEMP_=0x0000 0002
Then performing AND operation with 0xFFFF To guarantee that the 2 high bytes are ZEROS
Yields a result of -> _TEMP_=0x0000 0002
Then casting it to WORD -> result=0x0002
which is the higher 16bits from the original DWROD

أرجو أن أكون قدرت على التوضيح شوية.

أما بالنسبة لحجم الملف, GetFileSize بترجع قيمة فى البوينتر الى بتاخده

DWORD GetFileSize(
  HANDLE hFile,
  LPDWORD lpFileSizeHigh
);

** بإفتراض إن مفيش أخطاء حصلت

لو القيمة دى NULL يبقى الحجم موجود فى القيمة ال returned بس يعنى حتقرا ال returned value و حيبقى هو دا الحجم

لو القيمة مش NULL يبقى البوينتر دا بيشاور على ال high DWORD بتاعة الحجم و علشان تحسب الحجم لازم تعمل shift left للقيمة المشار عليها دى بمقدار 32bits و تعملها AND مع القيمة ال returned, مش عارف ممكن تحط الناتج فى double مثلا :unsure:

و علشان تريح نفسك إستعمل GetFileSizeEx

1
#3

شكرا اخي الكريم لردك وشرحك الوافي

Eng.Mostafa Abd El Zaher
 
Embedded Systems Programmer
Computer Programmer
 
للاطلاع على اعمالنا في مختلف المجالات برجاء زيارة صفحتنا
 
 

https://www.facebook.com/EgyESD

Mostafa_Cool2001@Hotmail.com

00201005674650

#4

شكرا BlueTeeth

لم اكن اعرف هذه المعلومه

هذا الموضوع مغلق.

مواضيع مشابهة