ใน JavaScript ตัวแปรจำนวนเต็มทั้งหมดจะถูกเซ็นชื่อเป็นจำนวนเต็มตามค่าเริ่มต้น สิ่งนี้หมายความว่าอย่างไร
จำนวนเต็มที่ลงนามจะใช้ 31 บิตแทนค่าของจำนวนเต็ม และบิต 32 แทนเครื่องหมายของจำนวนเต็ม 0 แทนจำนวนบวก และ 1 แทนจำนวนลบ
ช่วงค่าคือตั้งแต่ -2^31 - 2^31-1 ซึ่งก็คือ -2147483648 ถึง 2147483647
เมื่อ JavaScript ดำเนินการกับบิต JavaScript จะใช้ประเภทจำนวนเต็มที่ลงนามแบบ 32 บิต ซึ่งหมายความว่าผลลัพธ์ของการแปลงจะเป็นประเภทจำนวนเต็มที่ลงนามแบบ 32 บิตด้วย บางครั้งผลลัพธ์ที่ไม่คาดคิดจะเกิดขึ้นเมื่อเราทำการเปลี่ยนแปลง ต่อไปนี้เป็นการเปรียบเทียบระหว่างภาษา C และ JS
ภาษาซี
คัดลอกรหัสรหัสดังต่อไปนี้:
ไม่ได้ลงนาม int a = 3774191835u;
ไม่ได้ลงนาม int b = a >> 2;
/* ข == 943547958 */
จาวาสคริปต์
คัดลอกรหัสรหัสดังต่อไปนี้:
วาร์ ก = 3774191835;
วาร์ ข = ก >> 2;
/* ข == -130193866 */
อย่างที่คุณเห็น JavaScript ใช้จำนวนเต็มที่มีเครื่องหมายเมื่อดำเนินการบิต ดังนั้นเราจึงได้ผลลัพธ์ที่แตกต่างกัน จะแก้ปัญหาอย่างไร?
เราสามารถแปลงตัวเลขที่ลงนามใน JavaScript ให้เป็นตัวเลขที่ไม่ได้ลงนาม เพียงทำการดำเนินการ >>> 0
ทางที่ดีอย่าใช้ >> แนะนำให้ใช้ >>> เพราะบิตซ้ายสุดจะถูกแยกวิเคราะห์เป็นบิตเครื่องหมาย เมื่อตัวเลขล้น มันจะถูกแยกวิเคราะห์เป็นตัวเลขติดลบ