มันเป็นเรื่องของวิธีการจัดเก็บข้อมูล การโต้ตอบกับแซมของคุณจะทำการเปรียบเทียบที่ดีขึ้นถ้าคุณถามเพื่อให้คุณสามารถเขียนลงไปได้ แต่มีกระดาษมูลค่าแปดตัวอักษรเท่านั้น
"แซมให้ฉันเบอร์โทรศัพท์"
"5555555555"
"โอ้ไม่ฉันหมดถ้าเพียง แต่ฉันรู้ก่อนเวลาเท่าไหร่ข้อมูลที่ฉันขอให้ฉันได้เตรียมดีกว่า!"
ดังนั้นภาษาส่วนใหญ่จะทำให้คุณประกาศประเภทดังนั้นมันจะรู้และเตรียมล่วงหน้า:
"แซมหมายเลขโทรศัพท์ยาวเท่าไหร่"
"สิบตัวอักษร"
"ตกลงแล้วให้ฉันได้รับกระดาษชิ้นใหญ่กว่าตอนนี้ให้ฉันหมายเลขโทรศัพท์"
"5555555555"
"เข้าใจแล้ว! ขอบคุณแซม!"
มันจะยิ่งสวยขึ้นเมื่อคุณดูวิธีพื้นฐานจริง ๆ ที่จัดเก็บข้อมูล หากคุณเป็นเหมือนฉันคุณมีสมุดบันทึกที่มีบันทึกเบ็ดเตล็ดตัวเลขเพิ่งเขียนลงไปไม่มีบริบทหรือฉลากสำหรับสิ่งใดและคุณไม่มีเงื่อนงำอะไรที่มันหมายถึงสามวันต่อมา นี่เป็นปัญหาสำหรับคอมพิวเตอร์หลายครั้งเช่นกัน ภาษาจำนวนมากมีประเภท "int" (int, long, byte, byte) และประเภท "float" (float, double) ทำไมจึงจำเป็น
ก่อนอื่นเรามาดูวิธีการเก็บจำนวนเต็มและแสดงโดยทั่วไปภายในคอมพิวเตอร์ คุณอาจทราบว่าในระดับพื้นฐานมันเป็นเลขฐานสองทั้งหมด (1 และ 0) Binary เป็นระบบตัวเลขที่ทำงานเหมือนกับระบบเลขฐานสิบของเรา ในทศนิยมคุณนับ 0 ถึง 9 (ด้วยเลขศูนย์นำโดยนัยที่ไม่ได้เขียน) จากนั้นคุณหมุนกลับไปที่ 0 และเพิ่มตัวเลขถัดไปเพื่อให้คุณมี 10 คุณทำซ้ำจนกว่าคุณจะหมุนจาก 19 ถึง 20 ทำซ้ำจนกว่าคุณจะเกลือกกลิ้งจาก 99 ถึง 100 และอื่น ๆ
ไบนารีไม่แตกต่างกันยกเว้นว่าแทนที่จะเป็น 0 ถึง 9 คุณจะนับ 0 ถึง 1 0, 1, 10, 11, 100, 101, 110, 111, 1000 ดังนั้นเมื่อคุณพิมพ์ 9 ในหน่วยความจำที่บันทึกไว้ในไบนารี เป็น 1001 นี่คือตัวเลขจริง มันสามารถเพิ่มลบคูณและอื่น ๆ ในรูปแบบที่แน่นอน 10 + 1 = 11. 10 + 10 = 100 (ม้วนมากกว่า 1 ถึง 0 และถือ 1) 11 x 10 = 110 (และเทียบเท่า 11 + 11 = 110)
ขณะนี้อยู่ในหน่วยความจำจริง (รวมถึงรีจิสเตอร์) มีรายการอาร์เรย์สิ่งที่คุณต้องการเรียกใช้เป็นบิต (อาจเป็น 1 หรือ 0 ') ถัดจากกันและกันซึ่งเป็นวิธีที่ทำให้บิตเหล่านี้จัดระเบียบอย่างมีเหตุผลเพื่อสร้าง จำนวนมากกว่า 1 ปัญหาคือคุณทำอะไรกับทศนิยม? คุณไม่สามารถใส่ชิ้นส่วนของฮาร์ดแวร์ในระหว่างสองบิตในการลงทะเบียนและมันจะเสียค่าใช้จ่ายมากเกินไปในการเพิ่ม "บิตบิต" ในแต่ละคู่ของบิต แล้วจะทำอย่างไรดี?
คุณเข้ารหัสมัน โดยทั่วไปแล้วสถาปัตยกรรมของ CPU หรือซอฟต์แวร์จะเป็นตัวกำหนดว่าจะทำอย่างไร แต่วิธีการทั่วไปคือการเก็บเครื่องหมาย (+ หรือ - โดยทั่วไป 1 เป็นค่าลบ) ในบิตแรกของการลงทะเบียนmantissa (หมายเลขของคุณเปลี่ยนไป อย่างไรก็ตามหลายครั้งจำเป็นต้องกำจัดทศนิยม) สำหรับจำนวน X บิตต่อไปนี้และเลขชี้กำลัง (จำนวนครั้งที่คุณต้องเลื่อน) สำหรับส่วนที่เหลือ มันคล้ายกับสัญลักษณ์ทางวิทยาศาสตร์
การพิมพ์ช่วยให้คอมไพเลอร์รู้ว่ากำลังดูอะไรอยู่ ลองนึกภาพว่าคุณเก็บค่า 1.3 ไว้ในการลงทะเบียน 1 เราจะมากับรูปแบบการเข้ารหัสแฟนซีของเราที่นี่ 1 บิตสำหรับการลงชื่อ 4 สำหรับ mantissa และ 3 สำหรับการยกกำลัง (1 บิตสำหรับการลงนาม 2 สำหรับขนาด) นี่เป็นจำนวนบวกดังนั้นสัญญาณจึงเป็นบวก (0) แมนทิสซาของเราจะเป็น 13 (1101) และเลขชี้กำลังของเราจะเป็น -1 (101 (1 สำหรับค่าลบ, 01 = 1)) ดังนั้นเราเก็บ 01101101 ใน register 1 ตอนนี้เราไม่ได้พิมพ์ตัวแปรนี้ดังนั้นเมื่อ runtime ไปใช้มันก็บอกว่า "แน่นอนนี่เป็นจำนวนเต็มทำไมไม่" ดังนั้นเมื่อมันพิมพ์ค่าที่เราเห็น 109 (64 + 32 + 8 + 4 + 1) ซึ่งเห็นได้ชัดว่าไม่ถูกต้อง
ไม่ใช่ทุกภาษาที่คุณจะต้องพิมพ์อย่างชัดเจน C # มีคำหลัก "var" ที่ทำให้ประเภทของตัวแปรถูกตีความในเวลารวบรวมและภาษาอื่น ๆ เช่น Javascript มีการพิมพ์แบบไดนามิกทั้งหมดจนถึงจุดที่คุณสามารถเก็บจำนวนเต็มในตัวแปรแล้วกำหนดให้เป็นบูลีนจากนั้น กำหนดอีกครั้งเพื่อสตริงและภาษาที่ติดตามได้ทั้งหมด
แต่การคอมไพเลอร์ล่ามหรือรันไทม์นั้นง่ายกว่ามากและมักทำให้โปรแกรมเร็วขึ้นเพราะไม่ต้องใช้ทรัพยากรที่มีค่าในการเรียงลำดับการพิมพ์ทุกอย่าง - ถามคุณโปรแกรมเมอร์ ข้อมูลที่คุณให้