เลขจำนวนเต็มที่ลงนามใน C แทนตัวเลข หากa
และb
เป็นตัวแปรของประเภทจำนวนเต็มที่ลงนามมาตรฐานจะไม่ต้องการให้คอมไพเลอร์สร้างที่a+=b
เก็บนิพจน์เป็นa
สิ่งอื่นใดนอกจากผลรวมเลขคณิตของค่าที่เกี่ยวข้อง เพื่อให้แน่ใจว่าหากผลรวมเลขคณิตไม่พอดีa
ตัวประมวลผลอาจไม่สามารถใส่ได้ แต่มาตรฐานจะไม่ต้องการให้คอมไพเลอร์ตัดทอนหรือตัดค่าหรือทำสิ่งอื่นสำหรับเรื่องนั้นถ้าค่าที่เกิน ข้อ จำกัด สำหรับประเภทของพวกเขา โปรดทราบว่าแม้ว่ามาตรฐานไม่จำเป็นต้องมีการใช้งาน C จะได้รับอนุญาตให้ดักจับทางคณิตศาสตร์ล้นด้วยค่าที่ลงนามแล้ว
จำนวนเต็มที่ไม่ได้ลงนามใน C ทำหน้าที่เป็นวงแหวนพีชคณิตนามธรรมของจำนวนเต็มซึ่งสอดคล้องกันแบบโมดูโลกำลังสองบางส่วนยกเว้นในสถานการณ์ที่เกี่ยวข้องกับการแปลงหรือการดำเนินการด้วยประเภทที่มีขนาดใหญ่กว่า การแปลงจำนวนเต็มขนาดใด ๆเป็นชนิดที่ไม่ได้ลงนามแบบ 32 บิตจะทำให้สมาชิกที่สอดคล้องกับสิ่งต่าง ๆ ที่สอดคล้องกับจำนวนเต็ม mod 4,294,967,296 เหตุผลที่ลบ 3 จาก 2 ให้ผล 4,294,967,295 คือการเพิ่มบางอย่างที่สอดคล้องกันกับ 3 เข้ากับบางอย่างที่สอดคล้องกันกับ 4,294,967,295 จะให้บางสิ่งที่สอดคล้องกันกับ 2
แหวนแบบพีชคณิตนามธรรมมักเป็นสิ่งที่มีประโยชน์ แต่น่าเสียดายที่ C ใช้ความเซ็นชื่อเป็นปัจจัยในการตัดสินใจว่าประเภทควรเป็นแหวนหรือไม่ ค่าที่ไม่ได้รับการลงนามจะถือว่าเป็นตัวเลขมากกว่าสมาชิกวงแหวนเมื่อถูกแปลงเป็นประเภทที่มีขนาดใหญ่กว่าและค่าที่ไม่ได้ลงนามนั้นเล็กกว่าint
รับการแปลงเป็นตัวเลขเมื่อดำเนินการทางคณิตศาสตร์ใด ๆ ก็ตาม ถ้าv
เป็นuint32_t
ซึ่งเท่ากับ4,294,967,294
แล้วควรจะทำv*=v;
v=4
น่าเสียดายที่ถ้าint
เป็น 64 บิตก็ไม่ได้บอกว่าv*=v;
จะทำอะไรได้
ให้มาตรฐานเหมือนเดิมฉันขอแนะนำให้ใช้ประเภทที่ไม่ได้ลงนามในสถานการณ์ที่ต้องการพฤติกรรมที่เกี่ยวข้องกับวงแหวนเชิงพีชคณิตและประเภทที่เซ็นชื่อเมื่อต้องการแสดงตัวเลข มันโชคร้ายที่ C ดึงความแตกต่างในแบบที่เคยทำ แต่พวกมันคือสิ่งที่พวกเขาเป็น