(Two's Complement 1/2)
شاید براتون سوال شده باشه
کامپیوتر جمع رو میتونه راحت جمع انجام بده اما تفریق رو وقتی بهش میدی دیگه مثل حالت عادی عملیات رو انجام نمیده.
بر فرض مثال داریم:
انسان راحت میتونه حساب کنه که میشه
اما کامپیوتر چطور حساب میکنه؟
کامپیوتر میاد همین عملیات رو تبدیل به جمع میکنه، اما چطوری؟ (باید بگم ممنون شما چطوری؟)
واسه اینکه این عملیات تفریق تبدیل به عملیات جمع بشه عدد دوم که تو مثال ما
خب
بریم ببینیم چطوری
خیلی سادست. یه چیزی داریم به اسم مکمل 1 که با
کامپیوتر برای انجام هر عملیات تفریقی از روش
از اونجایی که میدونیم زبان ماشین فقط و فقط
واسه تبدیل کردن عدد
از اونجایی که میخوام تا
خب حالا میام میگم کدوم یکی از این توانهای
منطقا میشه
حالا این عدد
خب حاصل
خب حالا که تبدیل رو انجام دادیم، 25 رو هم تبدیل میکنیم چون به هر دو عدد برای تفریق نیاز داریم:
گفتیم کامپیوتر میاد علامت عدد دومی که تو مثال ما
اول میایم
چطوری؟ باید بیایم عدد
حالا معکوس یعنی چی؟ یعنی به جای
پس معکوس ما شد
حالا که مرحله
چطوری؟ به معکوس شده میایم یکی اضافه کنیم یعنی
جمع دو عدد
از سمت راست به سمت چپ.
سمت راست داریم
خب منطقا در ریاضیات میدونیم جمع
برای راحتی در گفتار میتونیم بگیم
حالا
پس بعدی میشه
دیگه چیزی نداریم پس بقیه اعداد رو خودش رو مینویسیم:
حالا که عدد
@ZeroX_0Day
شاید براتون سوال شده باشه
Computer چطوری میاد عملیات Subtract یا همون تفریق رو انجام میده؟کامپیوتر جمع رو میتونه راحت جمع انجام بده اما تفریق رو وقتی بهش میدی دیگه مثل حالت عادی عملیات رو انجام نمیده.
بر فرض مثال داریم:
25 - 18
انسان راحت میتونه حساب کنه که میشه
7اما کامپیوتر چطور حساب میکنه؟
کامپیوتر میاد همین عملیات رو تبدیل به جمع میکنه، اما چطوری؟ (باید بگم ممنون شما چطوری؟)
واسه اینکه این عملیات تفریق تبدیل به عملیات جمع بشه عدد دوم که تو مثال ما
18 هست باید منفی بشه. پس کامپیوتر چنین کاری میکنه:25 + (-18)
خب
25 که همونه، یه عملیات Operator عوض شده و یه علامت 18 که شده 18-بریم ببینیم چطوری
18 میشه 18-خیلی سادست. یه چیزی داریم به اسم مکمل 1 که با
One's Complement شناخته میشه. یه چیز دیگه هم داریم به مکمل دو که با Two's Complement شناخته میشه.کامپیوتر برای انجام هر عملیات تفریقی از روش
Two's Complement استفاده میکنه.از اونجایی که میدونیم زبان ماشین فقط و فقط
0 و 1 رو درک میکنه پس باید عدد رو تبدیل به Binary کنیم. خب 18- رو که بلد نیستیم حساب کنیم، بزار اول بیایم روی 18 کار کنیم. (نتیجه: پس هر عددی به ما دادن منفی بود در نظر نمیگیریم و میریم سراغ همون عدد اما از نوع مثبتش)واسه تبدیل کردن عدد
18 به Binary راحت ترین حرکت استفاده از توان های 2 یا به عبارت دیگهای Two Powers هست. (تقسیم چکشی متوالی 2 هم هست اما روش به درد نخوری هست) از اونجایی که میخوام تا
bit 8 حساب کنم پس تا 7^2 رو مینویسم که میشه 128128 64 32 16 8 4 2 1
خب حالا میام میگم کدوم یکی از این توانهای
2 از 18 کمتره؟منطقا میشه
16. پس میام یه تفریق ریز انجام میدم.18 - 16 = 2
حالا این عدد
2 که حاصل تفریق ما شد به کدوم یکی از این توانهای دو میخوره؟ یه توان 2 داریم پس منها میکنیم.2 - 2 = 0
خب حاصل
0 شد، در نتیجه بریم سراغ توان 2هایی که ازشون استفاده کردیم. 16 و 2 رو برابر با 1 قرار میدیم، توان 2هایی که استفاده نکردیم رو همه رو 0 میزاریم. بنابراین میشه:128 64 32 16 8 4 2 1
0 0 0 1 0 0 1 0
(00010010)
خب حالا که تبدیل رو انجام دادیم، 25 رو هم تبدیل میکنیم چون به هر دو عدد برای تفریق نیاز داریم:
128 64 32 16 8 4 2 1
0 0 0 1 1 0 0 1
(00011001)
گفتیم کامپیوتر میاد علامت عدد دومی که تو مثال ما
18 هست رو تغییر میده میکنه -18، چطوری؟اول میایم
One's Competent انجام میدیم. چطوری؟ باید بیایم عدد
Binary که به دست اوردیم رو به اصطلاح Invert کنیم یا معکوس کنیم. حالا معکوس یعنی چی؟ یعنی به جای
0 عدد 1 بگذاریم و به جای 1 عدد 0.18 in Binary:
00010010
Inverted:
11101101
پس معکوس ما شد
00010010حالا که مرحله
One's Complement رو انجام دادیم، میریم سراغ مرحله Two's Complement: چطوری؟ به معکوس شده میایم یکی اضافه کنیم یعنی
1+:11101101
+ 1
-----------
جمع دو عدد
Binary:از سمت راست به سمت چپ.
سمت راست داریم
1+1. خب منطقا در ریاضیات میدونیم جمع
1+1 میشه 2 اما اینجا دنیای Binary هست و رنج اعدادی که داریم فقط 0 و 1 هست.برای راحتی در گفتار میتونیم بگیم
1 + 1 شده 10.حالا
0 رو میزاریم و 1 باقی مانده رو میدیم سمت چپی که اصطلاحا میگن این 1 اینجا Carry شده.پس بعدی میشه
0 + 1 Carry که میشه خود 1.دیگه چیزی نداریم پس بقیه اعداد رو خودش رو مینویسیم:
1
11101101
+ 1
---------------------
11101110
حالا که عدد
18 رو ماهم مثل کامپیوتر کردیم 18- میریم سراغ جمع کردنش:00011001 —> 25
+ 11101110 —> -18
————————————----
1000000111
@ZeroX_0Day
👍1
(Two's Complement 2/2)
چطوری اینطوری شد؟
خب میایم اول میگیم
بعدش باز میگیم
باز دوباره
حالا اینجا داریم
حالا داریم
بعدش میرسیم به
در اخر میرسیم به
میبینیم که تعداد ارقام شده
حالا میایم با استفاده از توان های
پس داریم (اونایی که
خب
@ZeroX_0Day
چطوری اینطوری شد؟
خب میایم اول میگیم
0 + 1 که می شود 1 پس قرار میگیره اون پایین.بعدش باز میگیم
0 + 1 که می شود 1 پس قراره میگیره اون پایین.باز دوباره
0 + 1 که می شود 1 پس قرار میگیره اون پایین.حالا اینجا داریم
1 + 1 که گفتیم فرض میکنیم تو گفتار داریم میگیم میشه 10 پس 0 رو مینویسیم پایین 1 می شود Carry میدیم به سمت چپی.حالا داریم
0 + 1 که می شود 1 اما یه 1 Carry هم بالاش داریم پس میشه 10 که باز 0 رو مینویسیم 1 می شود Carry میدیم به سمت چپی.بعدش میرسیم به
0 + 1 که می شود 1 اما باز داریم میبینم بالاش یه 1 Carry هست که باز می شود 10 که باز 0 رو مینویسیم همچنان 1 Carry میشه میدیم به سمت چپی.در اخر میرسیم به
0 + 1 که میدونیم میشه 10 اما یه 1 Carry داریم که میشه 10 و اینجا میبینم دیگه سمت چپ تمومه پس چیزی نداریم که بخوایم 0 رو بنویسیم و 1 رو دوباره Carry کنیم. بنابراین خود 10 رو کامل مینویسیم که میشه:100000111
میبینیم که تعداد ارقام شده
9 در حالی که قبلا 8 بود. پس اون 9امی که اینجا 1 هست رو خط میزنیم و در نظر نمیگیریم:00000111
حالا میایم با استفاده از توان های
2 حساب میکنیم ببینم این عدد چنده:128 64 32 16 8 4 2 1
0 0 0 0 0 1 1 1
پس داریم (اونایی که
1 هست خونههاش رو جمع میکنیم):4 + 2 + 1 = 7.
خب
(18-)+25 می شود 7. جوابی که انسان هم یکی در میاد و دیدیم که کامپیوتر چطوری حساب میکنه و به این عدد میرسه.References:
- https://en.wikipedia.org/wiki/Two%27s_complement
- https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html#:~:text=Two's%20complement%20is%20the%20way,add%20one%20to%20the%20result.
- https://stackoverflow.com/questions/1049722/what-is-twos-complement
- https://www.freecodecamp.org/news/microprocessors-romance-with-integers/#:~:text=The%20leftmost%20or%20the%20most,tells%20us%20the%20actual%20magnitude.
@ZeroX_0Day
اگه براتون سوال هست
@ZeroX_0Day
Bit و Byte چی هستند میتونید به این مطلب از بیشتر بدانیم فیزیک (1) - صفحه 13 از رشته ریاضی فیزیک پایه دهم یه نگاهی بندازید.@ZeroX_0Day
(Matrix 1/5)
ماتریکس چیست و کاربرد آن در Computer Science چه چیزی است؟
- اول بیایم یک تعریف از
ماتریکس به یک آرایش مستطیل (به آرایش مستطیلی
به اعداد یا عبارت یا به طور کلی هر چیزی که داخل
به هر یک از عناصر داخل ماتریکس به زبان فارسی دِرایه گویند.
سطر رو
از حرف m برای سطر و حرف n برای ستون استفاده میکنیم که در نتیجه برسیم به m×n
بنابراین: m میشود
کاربرد
@ZeroX_0Day
ماتریکس چیست و کاربرد آن در Computer Science چه چیزی است؟
- اول بیایم یک تعریف از
Matrix داشته باشیم تا بهتر بتونیم درکش کنیم:ماتریکس به یک آرایش مستطیل (به آرایش مستطیلی
Rectangular Array هم گویند) شکلی از اعداد یا عبارتهای ریاضی گویند که به صورت سطر و ستون نوشته بشه - یعنی جوری که هر ستون یا هر سطر در ماتریکس، یک بردار را تشکیل بده.به اعداد یا عبارت یا به طور کلی هر چیزی که داخل
Matrix قرار گیرد یک عنصر یا یک Element گویند که برای نشان دادن یک Mathematical Object یا Property Of An Object استفاده میشود.به هر یک از عناصر داخل ماتریکس به زبان فارسی دِرایه گویند.
سطر رو
Rows نشان میدهیم و ستون رو Columns مینامیم.از حرف m برای سطر و حرف n برای ستون استفاده میکنیم که در نتیجه برسیم به m×n
بنابراین: m میشود
Rows که به صورت افقی یا همان Horizontal و همچنین n میشود Columns که به صورت عموی یا همان Vertical است.Rows —> HorizontalColumns —> Verticalکاربرد
Matrix رو میشه توی یک سری از Algorithmsهای مهم تو زمینه CS دونست. برای مثال یکی از کاربردهای Matrix زمانی هست که Graphic از Matrix برای Process و پردازش عکس مورد نظر ما به عنوان نتیجه نهایی میکنه.@ZeroX_0Day
🔥4
0xDay
(Matrix 3/5) چگونه یک عنصر یا Element در ماتریکس A را تشخیص دهیم؟ @ZeroX_0Day
(Matrix 4/5)
نحوه پیاده سازی ماتریکس A که تو مثال بالا داشتیم در
@ZeroX_0Day
نحوه پیاده سازی ماتریکس A که تو مثال بالا داشتیم در
C با استفاده از آرایههای 2 بعدی. (2D Arrays)@ZeroX_0Day
0xDay
(Matrix 4/5) نحوه پیاده سازی ماتریکس A که تو مثال بالا داشتیم در C با استفاده از آرایههای 2 بعدی. (2D Arrays) @ZeroX_0Day
(Matrix 5/5)
خروجی کد.
@ZeroX_0Day
خروجی کد.
References:
- https://en.wikipedia.org/wiki/Matrix_(mathematics)
- https://www.youtube.com/watch?v=yRwQ7A6jVLk
- https://www.youtube.com/watch?v=lQ2DB5TPH1o
- https://www.w3schools.com/c/c_arrays_multi.php
- https://users.cs.utah.edu/~germain/PPS/Topics/matrix.html
- https://www.cs.swarthmore.edu/~newhall/unixhelp/C_arrays.html
- http://electron9.phys.utk.edu/optics421/modules/Numerical/matrix.htm
- https://ocw.mit.edu/courses/6-s096-effective-programming-in-c-and-c-january-iap-2014/295f17e070b66cbec4a88de25ff3694f_MIT6_S096IAP14_ass1_p2.pdf
@ZeroX_0Day
(Register Flags 1/1)
ثبات پرچم یا همان
رجیستر فلگ چیزی هست که داخل
حالا در معماری
رجیستر فلگهای مهمی داریم مثل:
1 -🫥
2 -🫥
3 -🫥
4 -🫥
5 -🫥
6 -🫥
حالا که با فلگهای مهم آشنا شدیم، باید بدونیم نسبت به هر عملیاتی که توسط
توضیح هر
1 - اگر در فلگ
2 - اگر در فلگ
3 - اگر در فلگ
4 - اگر در فلگ
5 - اگر در فلگ
6 - اگر در فلگ
References:
@ZeroX_0Day
ثبات پرچم یا همان
Register Flag چیست؟رجیستر فلگ چیزی هست که داخل
Central Processing Unit (CPU) یا همون پردازنده هست که یک سری Bit رو نگهداری میکنه که این Bitها نمایش دهنده وضعیت عملیلتهای مختلفی هست که CPU انجام داده.حالا در معماری
X86 رجیستر فلگ 16 بیت (Bit) هست که شامل اطلاعاتی هست که پس از انجام یک کاری انجام شده. به این اطلاعات وضعیت پرچم یا Status Register هم گویند به این دلیل که نتیجه آخرین عملیات اجرا شده توسط CPU رو نشون میده. حالا این فلگها به بیتهای مختلفی تقسیم میشن که هر Bit نشان دهنده یک Flag یا به اصطلاح نشان دهنده وضعیت است.رجیستر فلگهای مهمی داریم مثل:
1 -
Carry Flag CF2 -
Zero Flag ZF3 -
Sign Flag SF4 -
OverFlow Flag OF 5 -
Parity Flag PF6 -
Auxiliary Carry Flag AFحالا که با فلگهای مهم آشنا شدیم، باید بدونیم نسبت به هر عملیاتی که توسط
CPU مثل عملیات حسابی (Arithmetic) - عملیات منطقی (Logical Operations) انجام میشه مقدار اون Flagها به 0 یا 1 تغییر میکند.توضیح هر
Register Flag:1 - اگر در فلگ
Carry Flag که آن را با CF نشان میدهیم، یک Carry از Most Significant Bit (MSB) هنگام جمع (Addition) به دست آوریم یا همینطور تفریق (Subtraction) که یک Borrow در MSB داریم مقدار CF را 1 قرار میدهیم اما در غیر این صورت مقدار CF برابر با 0 خواهد بود.2 - اگر در فلگ
ZF نتیجه برابر با 0 بود مقدار ZF می شود 1 اما برای نتیجهای که 0 نیست یا به اصطلاح Non-Zero است مقدار ZF برابر با 0 است.3 - اگر در فلگ
SF مقدار MSB برابر 1 باشد بنابراین مقدار SF هم 1 است اما اگر مقدار MSB برابر با 0 قرار گرفت مقدار SF هم 0 می شود.4 - اگر در فلگ
OF سر ریز بافر رخ دهد مقدار OF برابر با 1 است اما در غیر این صورت مقدار OF برابر با 0 خواهد بود.5 - اگر در فلگ
PF تعداد Low Byte زوج یا همان Even باشد مقدار PF برابر با 1 است اما اگر تعداد Low Byte فرد یا Odd بود بنابراین مقدار PF هم برابر با 0 خواهد بود.6 - اگر در فلگ
AF عملیات حسابی یا همان (Arithmetic Operations) یک Carry یا یک Borrow رخ دهد مقدار AF برابر با 1 است در غیر این صورت مقدار AF برابر با 0 خواهد بود.References:
- https://en.wikipedia.org/wiki/FLAGS_register
- https://www.geeksforgeeks.org/flag-register-8086-microprocessor/
- https://www.cs.princeton.edu/courses/archive/fall09/cos375/IA32StatusFlags.pdf
- https://stackoverflow.com/questions/73362953/how-is-the-overflow-flag-not-set-after-this-addition
- https://www.eecg.toronto.edu/~amza/www.mindsec.com/files/x86regs.html
- https://www.cs.uaf.edu/2009/fall/cs301/lecture/12_07_flags.html
@ZeroX_0Day
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
ممکنه براتون سوال پیش بیاد در معماری ❓
همینطور که میدونید
1.
2.
3.
4.
5.
6.
7.
8.
رجیسترهای (
1.
2.
3.
4.
5.
6.
7.
8.
رجیسترهای (
1.
2.
3.
4.
References:
@ZeroX_0Day
X86 چه نوع Registerهایی وجود داره؟ همینطور که میدونید
X86 به معنی 32 بیت (Bits) هست که چنین Registerهایی داریم که 8تای آنها رجیسترهای عمومی 32 بیتی (Bits) یا General Purpose Registers نام دارند. (نکته: در عکس اول RAX رو برای مثال آوردم که مربوط به معماری X64 هست و بنابراین 64 Bits هست.)1.
EAX2.
EBX3.
ECX4.
EDX5.
ESI6.
EDI7.
ESP (Stack Pointer)8.
EBP (Base Pointer)رجیسترهای (
Registers) 16 بیتی (Bits):1.
AX2.
BX3.
CX4.
DX5.
SI6.
DI7.
SP8.
BPرجیسترهای (
Registers) 8 بیتی (Bits):1.
AH AL2.
BH BL3.
CH CL4.
DH DLReferences:
- https://www.cs.virginia.edu/~evans/cs216/guides/x86.html
- https://www.nayuki.io/page/a-fundamental-introduction-to-x86-assembly-programming
- https://www.geeksforgeeks.org/general-purpose-registers-8086-microprocessor/
- https://www.eejournal.com/article/mastering-x86-memory-segmentation/
- https://www.tutorialspoint.com/what-are-the-cpu-general-purpose-registers
@ZeroX_0Day
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
(X86 (
📌 نگاهی بهتر به
در معماری
1️⃣ - 🫥
این
کاربرد آن در کمک کردن به پردازنده (
به یاد داشته باشید در فلگ
🐲 🐲 🐲 🐲 🐲 🐲 🐲 🐲
2️⃣ - 🫥
این فلگ زمانی تنظیم (
برای مثال اگر در جمع (
حال اگر، تفریق (
در ریزپردازنده (
🐲 🐲 🐲 🐲 🐲 🐲 🐲 🐲
3️⃣ - 🫥
این فلگ زمانی تنظیم (
🐲 🐲 🐲 🐲 🐲 🐲 🐲 🐲
4️⃣ - 🫥
این فلگ زمانی تنظیم (
به طور کلی اگر فلگ
اگر فلگ
🐲 🐲 🐲 🐲 🐲 🐲 🐲 🐲
5️⃣ - 🫥
این فلگ زمانی تنظیم (
🐲 🐲 🐲 🐲 🐲 🐲 🐲 🐲
6️⃣ - 🫥
این فلگ زمانی تنظیم (
فلگ AF زمانی برابر با 0 خواهد بود که بین Lower 4 Bits هیچ Carry یا Borrowای در طول عملیات رخ ندهد.
@ZeroX_0Day
80286) Register Flags)X86 Flag Registerدر معماری
X86 تعداد 6 فلگ رجیستر (Flag Register) داریم که به آنها پرچم وضعیت یا پرچم حسابی Status or Arithmetic Flags هم نیز گویند. آز انها برای ثبت اطلاعات مربوط به آخرین دستورات حسابی یا منطقی اجرا شده در CPU استفاده میشود و به طور کلی نشان دهنده اتفاقات یا رخدادهای انجام شده حین انجام یک عملیات است. 6 فلگ رجیستری که با آنها در این موضوع سر و کار داریم عبارتاند از:Zero Flag ZFاین
Flag اصطلاحا زمانی تنطیم (Set) میشود که نتیجه آخرین دستورات (Instruction) حسابی (Arithmetic) که اجرا میشوند صفر (0) باشد. کاربرد آن در کمک کردن به پردازنده (
Processor) است که میتواند تشخیص دهد دو مقدار برابر هستند یا Countdownآن به صفر رسیده است.به یاد داشته باشید در فلگ
ZF، عملگرهای منطقی (Logic Operation) و حسابی (Arithmetic Operation) نیز مانند XOR هم میتواند باعث ست شدن ZF بشود.Carry Flag CFاین فلگ زمانی تنظیم (
Set) میشود که آخرین عملیات حسابی (Arithmetic Operation) که روی دو عدد صحیح بدون علامت (Two Unsigned Integers) انجام می شود، نتیجه آن خیلی بزرگ یا خیلی کوچک باشد که آن را خارج از محدوده مینامند (Out Of Range). به زبان دیگر، این فلگ زمانی برابر با 1 خواهد گرفت که جواب آن عملیات حسابی Out Of Range باشد به طوری که سایز Register بیشتر باشد و درون آن جای نگیرد. برای مثال اگر در جمع (
ADD) دو عدد جواب عملیات طوری بود که فیت (Fit) اندازه رجیستر (Register) نباشد فلگ CF ست میشود (برابر با 1 می شود)حال اگر، تفریق (
SUB) دو عدد جوابی کوچکتر از 0 را به ما نشان دهد، فلگ CF باز هم ست میشود و برابر با 1 قرار میگیرد.در ریزپردازنده (
Microprocessor) 80286 تعداد بیتهای موجود 16 بیت است.Overflow Flag OFاین فلگ زمانی تنظیم (
Set) میشود که یک عملیات روی اعداد صحیح علامت دار (Signed Integers) منجر به Overflow یا Underflow شود.Sign Flag SFاین فلگ زمانی تنظیم (
Set) میشود که MSB یا (Most Significant Bit) برابر 1 باشد. میدانیم زمانی که MSB ما برابر با 1 است در نتیجه جواب یک عدد منفی (Negative).به طور کلی اگر فلگ
SF برابر با 0 باشد که نشان میدهد MSB هم 0 است، بیانگر این موضوع است که نتیجه ما یک عدد مثبت (Positive) یا صفر (0) است.اگر فلگ
SF برابر با 1 باشد که نشان میدهد MSB هم 1 است، بیانگر این موضوع است که نتیجه ما یک عدد منفی (Negative) است.Parity Flag PFاین فلگ زمانی تنظیم (
Set) میشود که LSB یا (Least Significant Byte) یا به عبارت دیگر 8 بیت (Bits) اول نتیجه از سمت راست، تعداد 1های موجود در آن 8 بیت زوج (Even) باشد که در این صورت فلگ PF برابر با 1 قرار میگیرد و به آن همچنین (Even Parity) هم نیز گویند. حال اگر تعداد 1های موجود در LSB یا همان 8 بیت اول فرد (Odd) باشد بنابراین فلگ PF برابر با 0 خواهد بود که به آن همچنین (Odd Parity) هم نیز گویند.Auxiliary Flag AFاین فلگ زمانی تنظیم (
Set) میشود که در بین 4 بیت (Bits) پایینی که به آن (Lower 4 Bits) هم میگویند، یک Carry یا یک Borrow رخ دهد. در این صورت فلگ AF برابر با 1 خواهد بود.فلگ AF زمانی برابر با 0 خواهد بود که بین Lower 4 Bits هیچ Carry یا Borrowای در طول عملیات رخ ندهد.
@ZeroX_0Day
Please open Telegram to view this post
VIEW IN TELEGRAM
(Overflow & Underflow 1/4)
📌 سرریز (
سرریز یا همان (
🔖 نکته: ممکن است عملیات ضرب (
در ریاضیات (
برای مثال یک نوع دادهای داریم به اسم
به طور کلی اگر بخواهیم آن را با مجموعه (
حال اگر تصور کنیم، سایز
🐲 🐲 🐲 🐲 🐲 🐲 🐲 🐲
⁉️ چگونه این محدوده بر اساس تعداد
در اعداد علامت دار (
بنابراین:
در اعداد علامت دار (
بنابراین:
در نتیجه محدوده یا همان (
🔤
🐲 🐲 🐲 🐲 🐲 🐲 🐲 🐲
پاریز یا همان (
در پست بعدی بهتر میتونیم
@ZeroX_0Day
Overflow) و پاریز (Underflow) چیست و چه زمانی رخ میدهد؟سرریز یا همان (
Overflow) به این معناست که اگر با جمع (Addition) دو عدد مثبت (Positive) نتیجه عددی منفی (Negative) به دست آمد، بدان معناست که Overflow رخ داده است. Multiplication) هم باعث این موضوع شود.در ریاضیات (
Mathematics) جمع دو عدد Positive همواره Positive خواهد ماند اما در Computer چون برای نوع دادههای (Data Types) اندازه (Size)های مختلفی در نظر گرفته شده است بنابراین اگر جمع آن دو عدد Positive از بالاترین مرز آن (Maximum Value) عبور کند در آن محدوده (Range) قابل نمایش نیست بنابراین به آن نتیجه، خارج از محدوده یا (Out Of Range) گویند.برای مثال یک نوع دادهای داریم به اسم
int که برای نمایش اعداد Integer استفاده میشود. همانطور که میدانید اعداد Integer همان اعداد صحیح هستند که در ریاضیات آن را با ℤ نمایش میدهیم.به طور کلی اگر بخواهیم آن را با مجموعه (
Sets) نمایش دهیم:ℤ = {... , -4 , -3 , -2 , -1 , 0, 1 , 2 , 3 , 4, ...}حال اگر تصور کنیم، سایز
intای که داریم 16 بیتی است، فقط میتوانیم اعداد بین آن را نمایش دهیم.Bit ها مشخص میشود؟در اعداد علامت دار (
Signed Numbers)، برای اعداد حداقل (Minimum Value) از فرمول (2ⁿ⁻¹)- استفاده میکنیم. (به یاد داشته باشید مقدار n در اینجا مقدار Bits است.)بنابراین:
-(2¹⁶⁻¹) = -32,768 —> Minimum Valueدر اعداد علامت دار (
Signed Numbers)، برای اعداد حداکثر (Maximum Value) از فرمول 2ⁿ⁻¹ - 1 استفاده میکنیم. (به یاد داشته باشید مقدار n در اینجا مقدار Bits است.)بنابراین:
2¹⁶⁻¹ -1 = 32,767 —> Maximum Valueدر نتیجه محدوده یا همان (
Range)ای که برای int16 داریم میشود:-32,768 32,767پاریز یا همان (
Underflow) به این معناست که اگر با تفریق (Subtraction) دو عدد به نتیجهای برسیم که آن منفی (Negative) باشد و همچنین از رنج و محدودهای که برای آن در هر بیت تعریف شده کمتر باشد Underflow رخ داده است.در پست بعدی بهتر میتونیم
Overflow و Underflow را درک کنیم.@ZeroX_0Day
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2 1 1
0xDay
(Overflow & Underflow 1/4) 📌 سرریز (Overflow) و پاریز (Underflow) چیست و چه زمانی رخ میدهد؟ سرریز یا همان (Overflow) به این معناست که اگر با جمع (Addition) دو عدد مثبت (Positive) نتیجه عددی منفی (Negative) به دست آمد، بدان معناست که Overflow رخ داده است.…
(Overflow & Underflow 2/4)
همانطور که میبینید یک متغیر از نوع و سایز
اگر این مقدار را جمع با
@ZeroX_0Day
همانطور که میبینید یک متغیر از نوع و سایز
int16_t و آن را به اسم MaximumValueOfInt16 نام گذاری کردیم و مقدار دهی رو انجام دادیم.اگر این مقدار را جمع با
1 کنیم میبینید که Overflow رخ میدهد و مقدار منفی به ما نشان میدهد.// Example of Overflow
#include <stdio.h>
#include <stdint.h> // Needed to use for int16
int main() {
// Int16 is -32768 & +32767
int16_t MaximumValueOfInt16 = 32767; // +32767 is the Maximum in int16
printf("This is the Maximum Value in int Data Type and 16 bits: %d\n",MaximumValueOfInt16);
printf("This is an example of Overflow in int Data Type and 16 bits: %d\n",(int16_t)(MaximumValueOfInt16+1));
return 0;
}
@ZeroX_0Day
0xDay
(Overflow & Underflow 2/4) همانطور که میبینید یک متغیر از نوع و سایز int16_t و آن را به اسم MaximumValueOfInt16 نام گذاری کردیم و مقدار دهی رو انجام دادیم. اگر این مقدار را جمع با 1 کنیم میبینید که Overflow رخ میدهد و مقدار منفی به ما نشان میدهد. //…
(Overflow & Underflow 3/4)
انجام مثال برای
تنها تفاوت در تفریق متغیر
@ZeroX_0Day
انجام مثال برای
Underflowتنها تفاوت در تفریق متغیر
MinimumValueOfInt16 به 1 است.// Example of Underflow
#include <stdio.h>
#include <stdint.h> // Needed to use for int16
int main() {
// Int16 is -32768 & +32767
int16_t MinimumValueOfInt16 = -32768; // -32768 is the Minimum in int16
printf("This is the Minimum Value in int Data Type and 16 bits: %d\n",MinimumValueOfInt16);
printf("This is an example of Underflow in int Data Type and 16 bits: %d\n",(int16_t)(MinimumValueOfInt16-1));
return 0;
}
@ZeroX_0Day
0xDay
(Overflow & Underflow 3/4) انجام مثال برای Underflow تنها تفاوت در تفریق متغیر MinimumValueOfInt16 به 1 است. // Example of Underflow #include <stdio.h> #include <stdint.h> // Needed to use for int16 int main() { // Int16 is -32768 & +32767 int16_t…
(Overflow & Underflow 4/4)
همچنین با استفاده از
@ZeroX_0Day
همچنین با استفاده از
sizeof میتوانیم متوجه Size یک Variable شویم.// Example of Underflow
#include <stdio.h>
#include <stdint.h> // Needed to use for int16
int main() {
// Int16 is -32768 & +32767
printf("UNDERFLOW\n");
int16_t MinimumValueOfInt16 = -32768; // // -32768 is the Minimum in int16
printf("This is the Minimum Value in int Data Type and 16 bits: %d\n",MinimumValueOfInt16);
printf("This is an example of Underflow in int Data Type and 16 bits: %d\n",(int16_t)(MinimumValueOfInt16-1));
printf("Size of MinimumValueOfInt16: %d Bits\n\n\n",sizeof(MinimumValueOfInt16) * 8);
printf("OVERFLOW\n");
int16_t MaximumValueOfInt16 = 32767; // +32767 is the Maximum in int16
printf("This is the Maximum Value in int Data Type and 16 bits: %d\n",MaximumValueOfInt16);
printf("This is an example of Overflow in int Data Type and 16 bits: %d\n",(int16_t)(MaximumValueOfInt16+1));
printf("Size of MaximumValueOfInt16: %d Bits\n",sizeof(MaximumValueOfInt16) * 8);
return 0;
}
@ZeroX_0Day
(Binary Addition & Show The X86 Flag Registers 1/11)
📌 نحوه انجام جمع (
اگر فرض کنیم دو عدد در مبنا
برای مثال اعداد فرضی که داریم
ابتدا باید هر 2 عدد را تبدیل به
میدانیم
اکنون باید بدانیم هر کدام یک از حروفهای
🐲 🐲 🐲 🐲 🐲 🐲 🐲 🐲
حال که با موارد ابتدایی در دنیای
برای
بنابراین به نتیجه زیر میرسیم:
برای درک بهتر در عکس نحوه تبدیل در پست بعدی نشان داده شده است.
@ZeroX_0Day
Addition) در سیستم باینری (Binary) و مشخص کردن فلگ رجیسترهااگر فرض کنیم دو عدد در مبنا
Hexadecimal یا همان مبنا 16 داریم و از ما خواسته شده است آنهارا با هم جمع (Addition) کنیم چطوری باید این کار رو انجام داد؟برای مثال اعداد فرضی که داریم
3CD6 و 5B9C است:3CD6 + 5B9Cابتدا باید هر 2 عدد را تبدیل به
0 یا 1، یا به عبارتی بهتر تبدیل به سیستم Binary کرد.میدانیم
Hexadecimal شامل اعداد 0-9 و همینطور حروف A-F میشود.Hexadecimal:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
اکنون باید بدانیم هر کدام یک از حروفهای
Hexadecimal برابر با چه مقداری است.A: 10
B: 11
C: 12
D: 13
E: 14
F: 15
حال که با موارد ابتدایی در دنیای
Hexadecimal آشنا شدیم، برای تبدیل آمادهایم:برای
3CD6 به شکل زیر عمل میکنیم:3CD6 (Hexadecimal):3 (Hexadecimal) —> 3 C (Hexadecimal) —> 12D (Hexadecimal) —> 13 6 (Hexadecimal) —> 6بنابراین به نتیجه زیر میرسیم:
3 12 13 6برای درک بهتر در عکس نحوه تبدیل در پست بعدی نشان داده شده است.
@ZeroX_0Day
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2