Logo

רד-בורד: ארכיון

ראשי > תיכנות > עוד בעיות עם PRINTF

21/11/2007 16:48:53 T4uSBaZ
רעבק.
קוד:
unsigned int abc=0xFFFFFFFF;
printf("%d",abc);

0xFFFFFFFF זה הערך הכי גדול שאפשר לייצג ב unsigned int.
ובמקום שprintf יראה לי אותו, הוא מראה לי -1.
אלה אם כן אני אומר לו %u .. זאת אמרת unsigned.

מה נסגר? חשבתי שהוא אמור לדעת מהו סוג המשתנה.!

21/11/2007 19:59:03 Debug
מצאתי משהו דומה, אני לא בטוח שזה יעזור אבל שווה לנסות:
http://www.dreamincode.net/forums/showtopic23249.htm

בהצלחה.
21/11/2007 22:08:42 T4uSBaZ
תודה רבה לך.
ובכל זאת, קראתי את זה וידעתי את כל זה.
הוא דיבר שמה על signed , בניגוד אלי.

אני מציין כאן בפירוש את שם המשתנה
קוד:
unsigned int abc=0xFFFFFFFFu;

שיכיל את הערך הגדול ביותר שיכול להכיל. אף שמתי לו u בסוף בדוגמא זו בכדי להראות שהוא unsigned.

אחרי שנעביר את המספר הנ"ל לבינארית,נוכל לראות כי בזיכרון (בהתחשב שint הוא כיום 4 בתים בארכיטקטורות חדשות)
11111111 11111111 11111111 11111111
הרווחים לשם נוחיות הקריאה (32 סיביות סך הכל).

כמובן, שבדיוק אותו מספר מיוצג בשיטת משלים 2 של signed int .. והמספר הזה, גם הוא יכול להיות מסומן כ 0xFFFFFFFF או פשוט 0x00-1 מכיוון שהוא -1.
קוד:
unsigned int num1=0xFFFFFFFF;
int num2=-1;
//num1==num2


בקיצור, אפשר להבין ששני ערכים שונים מיוצגים אותו דבר בבינארית.
ישנה פונקציה קטנה שאף תעזור לך לבחון זאת:
קוד:
void bit_display(int num)
{
int mask=1,i;
char bits[32];
for(i=0;i<32;i++)
{
if(num&mask) bits[31-i]=’1’;
else bits[31-i]=’0’;
mask<<=1;
}
printf("Binary representation: ");
for(i=0;i<32;i++) printf("%c",bits);
printf("\n");

}

אם יתבקש,אסביר איך היא פועלת.

בקיצור, חשבתי ש printf אמור לזהות את זה אוטומתית. ובכל זאת הוא מזהה את זה כsigned ואני יכול לראות את הערך כמו שאני רוצה רק כאשר אני משתמש ב%u זאת אמרת unsigned.
ומה יקרה אם יזהה אותו כunsigned כאשר המספר יהיה signed ? אין לי מחרוזת מיוחדת בכדי להעביר אותו ל signed.

כיצד printf פועלת בכלל? האם ישנו דבר מסויים שמאפשר לי לגלות את סוג המשתנה.. זאת אמרת האם הוא signed או unsigned? בסופו של דבר, רק הקומפיילר יודע את זה.

בקיצור אני מקווה שהבנת אותי..

אז , מה עושים? האם אני בכלל צודק בהשערותיי?

תודה =]
23/11/2007 02:24:27 HLL
printf לא יודע "לזהות" כלום - מלבד אפשרות לקבל את הפרמטר הבא על המחסנית באופן דינאמי. (כל עוד הוא יודע את הגודל שלו - ע"ע VarArgs).

בשביל שהוא לא יצטרך "לזהות" יש לו את ה Format String (הפרמטר הראשון) שאומר לו באיזה אופי הוא אמור להציג את הנתונים שנמצאים בפרמטרים, אז כן, %d משמש להדפסת מספר מסומן %u משמש להדפסת לא מסומן (ע"ע http://www.cplusplus.com/reference/clibrary/cstdio/printf.html)
מה יקרה את תבלבל אותו? כלום - הוא פשוט יעשה מה שביקשת - זוכר - אמרנו שמספר מסומן ומספר לא מסומן מיוצגים בזיכרון אותו דבר - הדבר היחיד ששונה זה בקומפילציה.[ההודעה נערכה על-ידי HLL ב-23/11/2007 02:29:46]
23/11/2007 08:53:02 T4uSBaZ
לאחר חקירה..
הבנתי שאני צריך לעשות ככה משום מה:
קוד:
char i=-128; //10000000
bit_display(i);
printf("%d",char(i<<1)); //suppous to be 00000000 = 0

כי אחרת הוא יפורשת (int?) אחר על ידי va_args או המאקרו האחרים, נכון?

printf מתומטם :D

תודה =]

[ההודעה נערכה על-ידי T4uSBaZ ב-23/11/2007 08:58:10][ההודעה נערכה על-ידי T4uSBaZ ב-23/11/2007 08:58:33]
עמודים: 1