زبان برنامه نویسی سی/تبدیل و جایگزینی داده‌ها: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
جزبدون خلاصۀ ویرایش
جزبدون خلاصۀ ویرایش
خط ۲۲۴:
در تبدیل متغیرهای غیر اعشاری ( مثل 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 ، اما چرا ؟ در یک کامپیوتر خانگی که معمولاً هم از نوع بیگ‌اندینلیتل‌اندین است عدد 5684 در حافظه موقت به صورت 0001011000110100 ذخیره می‌شود که اگر ۸ بیت آن را ( معادل ۱ بایت ) حذف کرده و در یک متغیر کاراکتر ذخیره کنیم ( که البته همان طور که گفته شد از قسمت ابتدایی ، داده‌ها شروع به حذف شدن می‌کنند ) عدد 00110100 باقی خواهد ماند که در مبنای دودویی ( باینری ) است و در مبنای دسیمال یا همان دهدهی می‌شود 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 و به صورت سخت‌افزاری ، اشاره می‌کنیم . عدد اعشاری با دقت معمولی ، ۳۲ بیت است . بیت آخر که ذخیره شده ( بیت اول در خانه‌های حافظه موقت ) علامتِ عدد را مشخص می‌کند . عدد ۱- به توان عددی که در بیت اول قرار دارد می‌رسد که این عدد یا ۱ است که ۱- به توان ۱ می‌شود ۱- و علامت ، منفی است یا می‌شود ۰ که در نتیجه ۱- به توان ۰ می‌شود ، ۱ و علامت ، مثبت است ؛ پس ۱ نمایانگر منفی بودن عدد و ۰ نمایانگر مثبت بودن عدد می‌باشد . هشت بیت بعدی به صورت ۲ به توان آن عدد منهای ۱۲۷ می‌باشد و در مبنای دهدهی محاسبه می‌شود ؛ که از ۰۰۰۰۰۰۰۰ شروع می‌شود که به صورت قرار دادی نمایانگر عدد ۰ می‌باشد و اگر در قسمت اعشاری همه اعداد ۰ باشند ، عدد ، ۰ منظور می‌شود . اما اگر در قسمت اعشاری ( مابقی بیت‌ها ) نیز مقداری ذخیره شده باشد ، ۰۰۰۰۰۰۰۰ به عنوان ۱ منظور می‌شود که منهای ۱۲۷ می‌شود ۱۲۶- که در نهایت می‌شود <sup>۱۲۶-</sup>۲ و مقداری که در ۸ بیتِ توان ، ذخیره می‌شود تا ۲۵۴ ادامه می‌یابد ( مقدار ۲۵۵ به صورت قرار دادی برای بی‌نهایت ذخیره شده است که با توجه به علامت ، می‌تواند منفی بی‌نهایت یا مثبت بی‌نهایت باشد ) که ۲۵۴ منهای ۱۲۷ می‌شود ۱۲۷ و عدد ۲ به توان ۱۲۷ می‌رسد . مقداری که از ۸ بیت توان با ۲ به توان آن عدد به دست آمد در ۲۳ بیت بعدی که قسمت اعشاری را ذخیره می‌کنند ضرب می‌شود . منتها قسمت اعشاری به صورت اعشار دودویی ( باینری ) ذخیره می‌شوند که در کامپیوتر با یک ۱ ، نیز جمع می‌شود . در دستگاه دودویی و در کامپیوتر که معمولاً بیگ‌اندینلیتل‌اندین می‌باشد بیت بیست و سوم که شماره ۲۲ ـم می‌شود ؛ ۲ به توان ۱- می‌رسد و ضربدر عدد بیت بیست و سوم می‌شود و جمع می‌شود با ۲ به توان ۲- ضربدر عدد بیت بیست و دوم که می‌شود شماره ۲۱ و همین طور تا بیت اول که می‌شود شماره ۰ ادامه پیدا می‌کند . مثلاً ۰٫۰۱۱۱ که در مبنای دودویی می‌باشد ، در مبنای دهدهی خودمان می‌شود : ۰٫۴۳۷۵ ؛ ۲ به توان ۱- ضربدر ۰ می‌شود ۰ که جمع می‌شود با ۱ ضربدر ۲ به توان ۲- که می‌شود ۰٫۲۵ و جمع می‌شود با ۱ ضربدر ۲ به توان ۳- که می‌شود ۰٫۱۲۵ و جمع می‌شود با ۱ ضربدر ۲ به توان ۴- که می‌شود ۰٫۰۶۲۵ که در نهایت عدد ۰٫۴۳۷۵ به دست می‌آید . ضمن اینکه در استاندارد ۷۵۴ انستیتوی جهانی مهندسین برق و الکترونیک ، استثناهایی هم در نظر گرفته شده است که با مطالعه لینک بالا و یا پیوند فایل پی‌دی‌اف استاندارد IEEE 754 می‌توانید از تمام مطالب استاندارد آگاه شوید
 
در تبدیل‌های اعشاری بزرگ‌تر به کوجک‌تر ( مثلاً double به float ) قسمت غیراعشاری از دست نمی‌رود و ابتدا از قسمت اعشاری و آن هم از قسمت انتهای آن ، مقادیر نادیده گرفته شده و پاک می‌شوند که البته با گرد شدن نیز همراه است و طی تبدیل ، اگر قرار بر از دست رفتن مقادیری باشد ، هم رقم‌های اعشاری کوچک‌تر حذف می‌شوند و هم عدد اعشاری گرد می‌شود