טיפוסים בשפת סי

drhouse2

New member
טיפוסים בשפת סי

אני לומד שפת סי באופן עצמאי לקראת לימודים אקדמיים, ואשמח להתייעץ פה.
כמה שאלות כלליות כדי לעשות סדר בראש:

1.טיפוס מסוג char תופס מקום של בית 1(8 ביטים), כלומר יש לנו 256 אפשרויות שונות של מספרים בינאריים. אם נרצה סימן חיובי/שלילי אז כביכול נקצה לסימן ביט אחד ואז האפשרויות הן בתחום (127+) - (12

למה כשאני רוצה ליצור מחרוזת שתעצור ברגע שמשתנה מסויים a יגיע לסוף הקובץ (1-) עליי להשתמש בטיפוס int?
אם האפשרויות מתחילות ממינוס 128, מינוס 1 כלול בתוכן ולא אמורה להיות בעיה?

2.למה על אותו עיקרון, אם אני רוצה לחשב את התחום של טיפוס double, אני יודע שמוקצה לו 8 בתים, כלומר יש לנו 2 בחזקת 64 אפשרויות = 1.84e19 ובטיפוס signed החזקה היא 63 - 9.22e18. אבל התחומים האמיתיים הם שונים?

תודה !
 

pitbol3

New member
אממ

ככה...
קודי אסקי ASCII, הינם בין 0 ל 255(סה"כ 256 תווים) ככה שEOF או 1- אינו נמצא בטווח זה.

תשים לב- singed זה בעצם מהטווח השלילי לחיובי, לעומת זאת ב unsinged מאחר והערך הנמוך ביותר הוא 0, ומאחר שיש את אותו מספר ביטים, המספר המירבי יוצא גדול פי 2(בערך)
מהגבוה ביותר בsinged. נסה לראות זאת בדגומא של char זה פשוט יותר...

אגב, אם אפשר לשאול, מה אתה הולך ללמוד?
 

BravoMan

Active member
תשובות:

1) טיפוס char בשפת C הוא טיפוס signed, כלומר הוא כבר בעל סימן ולכן טווח הערכים שניתן לאחסן במשתנה מטיפוס זה הוא בין 128- ל-127.

המשפט "ליצור מחרוזת שתעצור ברגע שמשתנה מסוים יגיע לסוף הקובץ" הוא חסר משמעות.
משתנים לא "מגיעים לסוף הקובץ".
פונקציות קריאה, כגון fread או fgetc יכולות להגיע לסוף הקובץ.

מכיוון שטבלת ASCII המורחבת משתמשת בכל 256 ערכים של char, כדי שניתן יהיה להבדיל בין קריאה של תו שערכו 1- (או 255) לבין מצב שהפונקציה הגיע לסוף הקובץ ואין מה לקרוא, fgetc מחזירה ערך מטיפוס גדול יותר, ובדרך עושה המרה של טיפוס char ל-unsigned char.

2) טיפוס double אינו מציג מספרים רק מספרים שלמים, אלא יכול להציג גם כל מספר ממשי בטווח שלו בשיטה שנקראת "נקודה צפה".
לכן, שיטת הייצוג שלו שונה, וקצת מסובכת בהשוואה לייצוג בינרי של מספר שלם.

תוכל לקרוא על כך כאן:
http://en.wikipedia.org/wiki/Floating_point
 

drhouse2

New member
תגובה

תודה רבה על המענה המהיר,

אם ככה, אז מה המשמעות של כל הערכים השליליים של char ממינוס 128 עד מינוס 1? לפי טבלת אסקי הם לא מוגדרים לא כספרות ולא כתווים?
 

BravoMan

Active member
זה כבר תלוי איפה אתה גר


טבלת ASCII הורחבה כדי לטפל בתווים וסימנים נוספים שלא נכנסו לטבלה המקורית.
https://en.wikipedia.org/wiki/Extended_ASCII

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

כיום, בגלל שלמחשבים יש הרבה יותר זיכרון ממה שהיה בעבר, והרבה פעמים צריך יכולת לשלב בין מספר שפות אנושיות, משתמשים ב-Unicode לייצוג תווים שיכול לדרוש (יש כמה דרכי קידוד, ולא נכנס לזה עכשיו) עד 4 בתים כדי לייצג תו בודד.
 
תיקון קל

char יכול להיות signed ויכול להיות unsigned.
בכל מקרה, הוא טיפוס שונה מ-signed char ומ-unsigned char.
 

BravoMan

Active member
כרגיל אתה צודק...

לפי הסטנדרט, (גרסת ANSI) אכן סימן של טיפוס char אינו מוגדר, אם זאת למיטב זיכרוני הקומפיילר של MS, ומימוש של gcc עבור x86 מגדירים char (ללא תוספות) כ-signed.

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