سوال به اینشکل بود:
فرضیه زیر با کدامیک از گزینهها سازگاری دارد؟
(x + 1) < x == true
1. uint8_t x = 255;
2. uint32_t x = -1;
3. uint8_t = 0;
4. uint32_t = 0;
درنگاه اول شاید مسخره بهنظر بیاد که چطور یک عددی بهعلاوه یک ممکنه از خود اون عدد کوچیکتر باشه اما در زبانهایی که wrapping arithmetic دارن این اتفاق کاملاً ممکنه.
دلیل این اتفاق Integer Overflow در اعداد بدون علامت (Unsigned Integers) هست. وقتی که نتیجه یه عملیات از بیشترین مقدار قابل نمایش در یک نوع داده بیشتر میشه، مقدار بهصورت Modulo محاسبه میشه و از ابتدای بازه اون نوع داده دوباره شروع میشه (Wrap Around).
برای مثال، اگه x از نوع uint8_t و برابر 255 باشه، عبارت x + 1 برابر 0 میشه چون 255 بزرگترین مقدار قابل نمایش ۸ بیتی هست. بنابراین:
uint8_t x = 255;
(x + 1) < x // 0 < 255 => true
همین اتفاق برای
uint32_t x = -1;
هم رخ میده. مقدار -1 هنگام انتساب به uint32_t به 0xFFFFFFFF تبدیل میشه و با اضافه کردن 1 دوباره به 0 میرسه.
Group: @azad_program
Channel: @kiau_program

