ฉันได้รับการตรวจสอบการเขียนโปรแกรม C และมีเพียงสองสามสิ่งที่รบกวนฉัน
ลองทำโค้ดนี้กันตัวอย่าง:
int myArray[5] = {1, 2, 2147483648, 4, 5};
int* ptr = myArray;
int i;
for(i=0; i<5; i++, ptr++)
printf("\n Element %d holds %d at address %p", i, myArray[i], ptr);
ฉันรู้ว่า int สามารถมีค่าสูงสุดเป็นบวก 2,147,483,647 ดังนั้นเมื่อทำอย่างนั้นมันจะ "ล้น" ไปยังที่อยู่หน่วยความจำถัดไปซึ่งทำให้องค์ประกอบ 2 ปรากฏเป็น "-2147483648" ที่ที่อยู่นั้นหรือไม่ แต่นั่นก็ไม่สมเหตุสมผลเพราะในผลลัพธ์มันยังบอกว่าที่อยู่ถัดไปเก็บค่า 4 จากนั้น 5 ถ้าจำนวนที่หกไปยังที่อยู่ถัดไปนั่นจะไม่เปลี่ยนค่าที่เก็บไว้ที่ที่อยู่นั้น ?
ฉันจำรางจากการเขียนโปรแกรมใน MIPS Assembly และดูค่าการเปลี่ยนแปลงที่อยู่ในระหว่างขั้นตอนของโปรแกรมทีละขั้นตอนว่าค่าที่กำหนดให้กับที่อยู่เหล่านั้นจะเปลี่ยนไป
นอกจากว่าฉันจำไม่ถูกต้องแล้วนี่เป็นคำถามอื่น: ถ้าจำนวนที่กำหนดให้กับที่อยู่เฉพาะมีขนาดใหญ่กว่าประเภท (เช่นใน myArray [2]) แล้วมันจะไม่ส่งผลกระทบต่อค่าที่เก็บไว้ที่อยู่ต่อไป?
ตัวอย่าง: เรามี int myNum = 4 พันล้านที่ที่อยู่ 0x10010000 แน่นอน myNum ไม่สามารถจัดเก็บ 4 พันล้านดังนั้นจึงปรากฏเป็นจำนวนลบที่อยู่นั้น แม้ว่าจะไม่สามารถจัดเก็บจำนวนมากนี้ได้ แต่ก็ไม่มีผลต่อค่าที่เก็บไว้ในที่อยู่ถัดไปของ 0x10010004 แก้ไข?
ที่อยู่หน่วยความจำมีพื้นที่เพียงพอที่จะเก็บขนาดตัวเลข / ตัวอักษรและถ้าขนาดมีขนาดเกินขีด จำกัด ก็จะถูกนำเสนอแตกต่างกัน (เช่นพยายามเก็บ 4 พันล้านไว้ใน int แต่จะปรากฏเป็นตัวเลขติดลบ) และ ดังนั้นจึงไม่มีผลต่อตัวเลข / ตัวอักษรที่เก็บไว้ในที่อยู่ถัดไป
ขออภัยถ้าฉันลงน้ำ ฉันมีสมองที่ใหญ่ผายลมตลอดทั้งวันจากนี้
int c = INT.MAXINT; c+=1;
และดูว่าเกิดอะไรขึ้นกับค