เลขที่
"ชนิดข้อมูล" ของตัวแปรเกี่ยวข้องเฉพาะในซอร์สโค้ด (และในบางภาษาเท่านั้น) มันบอกคอมไพเลอร์วิธีการรักษาตัวแปร
ชนิดข้อมูลระดับสูงเหล่านี้ไม่มีอยู่ในโค้ดที่แปล (เนทีฟ) พวกเขาสามารถส่งผลกระทบต่อสิ่งที่สร้างคอมไพเลอร์ แต่คำแนะนำตัวเองไม่สนใจว่าข้อมูลหมายถึงตัวละครหรือตัวเลข
ตัวแปรไม่มีอยู่ในฮาร์ดแวร์ ในฮาร์ดแวร์คุณมีตำแหน่งหน่วยความจำและคำแนะนำที่ใช้งานได้
ตัวแปรอาจถูกมองว่าเป็นมุมมองของข้อมูลที่ตำแหน่งหน่วยความจำ - ถ้าคุณเหล่และดูที่หน่วยความจำเดียวกันแตกต่างกันเล็กน้อย (ตัวแปรที่แตกต่างกับชนิดที่ต่างกันซึ่งอ้างถึงที่ตั้งเดียวกัน) ค่าไบนารีเดียวกันอาจมีความหมายแตกต่างกัน .
ยกตัวอย่างเช่น 0x41 A
ไบต์อาจจะตีความว่าเป็นตัวละคร มันอาจถูกตีความว่าเป็นจำนวนเต็มไบต์65
เดียว มันอาจตีความได้ว่าเป็นหนึ่งไบต์ในจำนวนเต็มจำนวนเต็มหรือจำนวนทศนิยมหรือหนึ่งไบต์ในการเข้ารหัสอักขระแบบหลายไบต์ มันอาจเป็นบิตเซ็0b1000001
ต ทั้งหมดมาจากไบต์เดียวกันในตำแหน่งหน่วยความจำเดียวกัน ในภาษา C คุณสามารถเห็นเอฟเฟกต์นี้โดยการชี้ไปที่ประเภทต่าง ๆ เหล่านี้
เมื่อคุณมี "บัฟเฟอร์มากเกินไป" คุณกำลังทำอะไรบางอย่างนอกขอบเขตของสิ่งที่คอมไพเลอร์หรือภาษาของคุณอาจคาดหวัง แต่เท่าที่ฮาร์ดแวร์เกี่ยวข้อง1คุณกำลังเขียนไบต์ (ไม่ว่าเดียวหรือหลาย) ไปยังตำแหน่งหน่วยความจำ ตำแหน่งหน่วยความจำไม่มี "ประเภท" ในความเป็นจริงฮาร์ดแวร์ไม่ทราบด้วยซ้ำว่าชุดไบต์ใด ๆ ที่สร้างอาร์เรย์หรือบัฟเฟอร์ในรหัสของคุณ
ทุกครั้งที่คุณเข้าถึงตำแหน่งหน่วยความจำในรหัสของคุณคำแนะนำจะทำงานตามที่กำหนดไว้ในตอนแรก เช่นถ้าพวกเขาคาดหวังว่าจะมีตัวเลขพวกเขาจะทำอะไรกับไบต์ของข้อมูลราวกับว่าพวกเขาเป็นตัวเลข
หากต้องการใช้ตัวอย่างสมมติว่าคุณint
เป็นจำนวนเต็ม 4 ไบต์ (32- บิต) ที่ได้รับการรับรอง:
+-------------+--------------------------------------------+-----------+
| Source code | char[15] | int |
+-------------+--------------------------------------------------------+
| Memory |61|61|61|62|62|62|63|63|63|64|64|64|65|65|65|EF|BE|AD|DE|
+-------------+--------------------------------------------------------+
คุณจะเห็นว่าint
ที่ตั้งของหน่วยความจำ 's ตอนนี้มี0xEFBEADDE
สมมติว่า big-ระบบ2 นี่คือ int แบบ 32 บิตที่ลงนาม-272716322
แล้ว ทีนี้ถ้าคุณตีความหน่วยความจำเดียวกันกับ int ( uint
) ที่ไม่ได้ลงชื่อมันจะเป็น4022250974
เช่นนั้นแทน สำหรับข้อมูลเดียวกันในหน่วยความจำความหมายนั้นขึ้นอยู่กับว่าคุณดูอย่างไร
1มีกลไกบางอย่างที่ป้องกันไม่ให้คุณเขียนลงในพื้นที่ป้องกันของหน่วยความจำและจะทำให้โปรแกรมของคุณทำงานล้มเหลวหากคุณพยายามทำเช่นนั้น
2 x86 จริง ๆ แล้วเป็น endian น้อยซึ่งหมายความว่าคุณตีความไบต์ที่ทำขึ้นค่าย้อนหลัง ดังนั้นใน x86 คุณควรที่จะ0xDEADBEEF
ให้ลงชื่อ-559038737
หรือไม่ได้ลงนาม3735928559
แทน