בעיה ב++C

ulevi92

New member
בעיה ב++C

שלום, יש לי מספר בעיות.
התחלתי ללמוד ממש לפני מספר ימים ++C והבעיות לפי מה שאני שם לב הם לא בקוד עצמו...
אני משתמש בתוכנה Eclipse בתור IDE ובMinGE
שמתי לב שגם בcodeblocks אני מקבל אותו דבר. מדובר בcompiler?
את הקוד: LONG_INT_MAX ומקבל את אותו ערך בדיוק כמו של INT_MAX, ואותו דבר גם לגבי הערך המינימאלי.
אבל שמתי לב כאשר אני כותב LONG_LONG_INT_MAX אני מקבל את הערך הנכון לlong.
בנוסף, אני לא יכול להשתמש בקיצור LLONG.
עוד דבר ששמתי לב אליו, זה כאשר אני כותב LONG DOUBLE אני מקבל ערך שהוא פשוט אסטרונומי וממש לא מה שאני אמור לקבל.
אני מכניס:
long double Lvalue = 123.12345678901;

cout << setprecision(20) << fixed << Lvalue << endl;
ומקבל:
-3838913234421866800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000000
 

Guy Yafe

New member
נראה שאין בעיה כלל

על פי התקן של C++, משתנה מסוג LONG הוא בגודל 4 בתים ואילו משתנה מסוג LONG LONG הוא בגודל 8 בתים.
&nbsp
לגבי הקיצורים: כל קומפיילר בא עם קיצורים משלו. אני ממליץ לך פשוט לא להשתמש בקיצורים שאינם תקניים.
&nbsp
לגבי הפלט המוזר שלך: הרצתי עכשיו את הקוד והכל נראה בסדר. שלח את הקוד המלא.
 

ulevi92

New member
קוד לדוגמא:

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
long double Lvalue = 123.123123123;
cout << setprecision(20) << fixed << Lvalue << endl;
return 0;
}
 

BravoMan

Active member
הסבר:

אחד הדברים ש-++C ירשה מ-C (למרות היותה שפה שונה), היא שגודל טיפוסים בסיסיים אינו קבוע, ומשתנה בהתאם למימוש הקומפיילר עבור חומרה ומערכת הפעלה ספציפיים.

התקן של השפה קובע כמה תנאים למימוש, אבל לא כופה גודל ספציפי.
קרא כאן:
https://msdn.microsoft.com/en-us/library/cc953fe1.aspx

הנה קוד פשוט שמראה לך את הגדלים שמעניינים אותך:
קוד:
#include <iostream>

using namespace std;

int main(int argc, char **argv) {
	cout << "Size of int = " << sizeof(int) << endl;
	cout << "Size of long = " << sizeof(long) << endl;
	cout << "Size of long long = " << sizeof(long long) << endl;
	cout << "Size of double = " << sizeof(double) << endl;
	cout << "Size of long double = " << sizeof(long double) << endl;
}

אצלי, על Ubuntu 64 bit ו-gcc 4.9.4 התוצאה היא:
קוד:
Size of int = 4
Size of long = 8
Size of long long = 8
Size of double = 8
Size of long double = 16

כמובן, אין שום בעיה שהתוצאה תהיה שונה אצלך.
אם אתה צריך משתנה בגודל קבוע וידוע מראש, יש טיפוסים כגון int32_t שמבטיחים כמות בתים מסוימת.
 
למעלה