زبان برنامه نویسی سی/تبدیل و جایگزینی دادهها: تفاوت میان نسخهها
محتوای حذفشده محتوای افزودهشده
جزبدون خلاصۀ ویرایش |
جزبدون خلاصۀ ویرایش |
||
خط ۲۲۴:
در تبدیل متغیرهای غیر اعشاری ( مثل int و long ) به متغیرهای اعشاری ( مثل float و double ) ، یک بخش اعشاری درست به همان اندازهای که بزرگترین نوع اعشاری دارد ( در قسمت اعشار خود ) ، به همه آنها اضافه خواهد شد . در تبدیل انواع دادههای اعشاری به دادههای صحیح ، کامپایلرهای مدرن بخش اعشاری را نادیده میگیرند اما برخی کامپایلرها بر اساس گرد کردن اعداد اعشاری کار میکنند که معمولاً بر اساس گرد کردن در ریاضی است ( مثلاً کوچکتر از ۰٫۵ به عدد کوچکتر گرد میشود و بزرگتر از ۰٫۵ به عدد بزرگتر ) و برخی کامپایلرها نیز در تبدیل دادههای اعشاری به غیر اعشاری ، بین کست کردن ایفای نقش غیرعلنی و علنی تفاوت قائل میشوند ؛ برای دانستن اینکه کامپایلر شما چگونه عمل میکند به راهنمای آن مراجعه کنید . در دادههایی که همگی اعشاری هستند ( تبدیل انواع اعشاری با دقت معمولی یا دوبرابر یا long double ) ، تبدیلها به نحوی انجام میشود که قسمت اعشار از بین نرود ولی اگر مقدار ما ، در داده نتیجه جا نشود ، اول از قسمت اعشاری مقادیر حذف میشوند ( که با گرد کردن نیز همراه است ) . ضمن اینکه در احضار تابع ، در صورت همخوانی نداشتن نوع داده آرگومان با پارامتر ، قوانین پیشین ، اعمال میگردند
در پایان باید بدانید که در تبدیل دادهها ، اگر قرار بر از دست رفتن دادهها باشد ، در سیستمهای [https://fa.wikipedia.org/wiki/%D8%A7%D9%86%D8%AF%DB%8C%D8%A7%D9%86 بیگاندیَن] که دادهها از خانههای ابتدایی به سمت خانههای انتهایی حافظه شروع به پر شدن میکنند ، دادهها از قسمت
برای درک بهتر مطلب ، در مثال آخرِ کست کردن ، مقدار 5684 ما تبدیل شد به 52 ، اما چرا ؟ در یک کامپیوتر خانگی که معمولاً هم از نوع
{{چپچین}}
<code>-(2 - 2^-23) × 2^127 to (2 - 2^-23) × 2^127</code>
خط ۲۴۰:
https://en.wikipedia.org/wiki/Single-precision_floating-point_format
'''توضیح :''' این مبحث مربوط به نوشتن کامپایلر میشود که مبتنی بر علم ریاضیات بوده و در علوم برق و الکترونیک نیز مورد استفاده قرار میگیرد ؛ اما به صورت مختصر در اینجا به نحوه ذخیره شدن و پردازش اعداد اعشاری در زبانهای سطح پائینی مثل C و به صورت سختافزاری ، اشاره میکنیم . عدد اعشاری با دقت معمولی ، ۳۲ بیت است . بیت آخر که ذخیره شده ( بیت اول در خانههای حافظه موقت ) علامتِ عدد را مشخص میکند . عدد ۱- به توان عددی که در بیت اول قرار دارد میرسد که این عدد یا ۱ است که ۱- به توان ۱ میشود ۱- و علامت ، منفی است یا میشود ۰ که در نتیجه ۱- به توان ۰ میشود ، ۱ و علامت ، مثبت است ؛ پس ۱ نمایانگر منفی بودن عدد و ۰ نمایانگر مثبت بودن عدد میباشد . هشت بیت بعدی به صورت ۲ به توان آن عدد منهای ۱۲۷ میباشد و در مبنای دهدهی محاسبه میشود ؛ که از ۰۰۰۰۰۰۰۰ شروع میشود که به صورت قرار دادی نمایانگر عدد ۰ میباشد و اگر در قسمت اعشاری همه اعداد ۰ باشند ، عدد ، ۰ منظور میشود . اما اگر در قسمت اعشاری ( مابقی بیتها )
در تبدیلهای اعشاری بزرگتر به کوجکتر ( مثلاً double به float ) قسمت غیراعشاری از دست نمیرود و ابتدا از قسمت اعشاری و آن هم از قسمت انتهای آن ، مقادیر نادیده گرفته شده و پاک میشوند که البته با گرد شدن نیز همراه است و طی تبدیل ، اگر قرار بر از دست رفتن مقادیری باشد ، هم رقمهای اعشاری کوچکتر حذف میشوند و هم عدد اعشاری گرد میشود
|