مشکل در استفاده از >> - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

مشکل در استفاده از >>

0 امتیاز

کشگل این کد چیه ؟

#include <iostream>

int main()
{
    for (int32_t n = 1; n>= 0; n--)
    {
        std::cout << "n: " << n << std::endl;
        std::cout << std::dec << "  64 - n: " << (64 - n) << std::endl;
        std::cout << std::hex << "  0x1ULL << 64: " << (0x1ULL << 64) << std::endl;
        std::cout << std::hex << "  0x1ULL << (64 - n): " << (0x1ULL << (64 - n)) << std::endl;
    }
}

خروجی برنامه بالا اینه

n: 1
  64 - n: 63
  0x1ULL << 64: 0
  0x1ULL << (64 - n): 8000000000000000
n: 0
  64 - n: 64
  0x1ULL << 64: 0
  0x1ULL << (64 - n): 1

برای n=0 چرا خروجی (0x1ULL << 64)  (0x1ULL << (64 - n) با هم فرق داره ؟!

سوال شده فروردین 19, 1393  بوسیله ی MsM (امتیاز 108)   3 4 13

1 پاسخ

+2 امتیاز
 
بهترین پاسخ
اگر تعداد حرکت-بیت ها از اندازه متغییر بیشتر یا برابر با اندازه متغییر باشه نتیجه نا معلومی داره .

و اینکه چرا وقتی شما 64 بیت رو حرکت دادید این اتفاق نیافتاد به خاطر اینه که وقتی شما بصورت لفظی نوشتید 64 کامپایلر این رو زمان-ترجمه میفهمه که نتیجه اشتباه میشه و مقدار0 برای نتیجه در نظر میگیره . و این رو بصورت یک اخطار تو خروجی نشون میده .

 

ولی وقتی شما نوشتید ( 64 منهای n ) این نتیجه باید در زمان-اجرا معلوم بشه و کامپایلر نمیتونه پیش بینیش بکنه و نتیجه اون رو به 0 تغییر بده و برای همین نتیجه اشتباه پیش میاد.
پاسخ داده شده فروردین 19, 1393 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
انتخاب شد فروردین 21, 1393 بوسیله ی BlueBlade
...