อธิบายว่าทำไม x == ~(~x + 1) + 1 (ส่วนเสริมสองตัวและข้างหลัง!)

ดังที่เราทุกคนทราบกันดีว่าจำนวนลบในหน่วยความจำมักจะแสดงเป็นจำนวนเสริมของสองตัวเช่นนั้น

from x to ~x + 1

และเพื่อกลับไป เราไม่ได้ทำสิ่งที่ชัดเจนเช่น

~([~x + 1] - 1)

แต่เราทำแทน

~[~x + 1] + 1

ใครช่วยอธิบายหน่อยได้ไหมว่าทำไมมันถึงใช้งานได้ตลอด? ฉันคิดว่าฉันสามารถพิสูจน์มันด้วยตัวเลข 1 บิต 2 บิต 3 บิต แล้วใช้การเหนี่ยวนำทางคณิตศาสตร์ แต่มันไม่ได้ช่วยให้ฉันเข้าใจว่ามันทำงานอย่างไร

ขอบคุณ!


person Solar Dia    schedule 06.11.2015    source แหล่งที่มา
comment
ที่เกี่ยวข้อง: จะพิสูจน์ได้อย่างไรว่าคำสั่ง C -x, ~x+1 และ ~(x-1) ให้ผลลัพธ์เหมือนกัน ข้อมูลระบุตัวตนเสริมของอีก 2 ตัว   -  person Peter Cordes    schedule 06.12.2020


คำตอบ (2)


นั่นก็เป็นสิ่งเดียวกันอยู่แล้ว นั่นคือ ~x + 1 == ~(x - 1) แต่ขอพักไว้ก่อนก่อน

f(x) = ~x + 1 คือค่าผกผันของมันเอง การพิสูจน์:

~(~x + 1) + 1 =
(definition of subtraction: a - b = ~(~a + b))
x - 1 + 1 =
(you know this step)
x

เช่นกัน~x + 1 == ~(x - 1). ทำไม ดี,

~(x - 1) =
(definition of subtraction: a - b = ~(~a + b))
~(~(~x + 1)) =
(remove double negation)
~x + 1

และคำจำกัดความของการลบ (ผิดปกติเล็กน้อย) นั้น a - b = ~(~a + b)?

~(~a + b) =
(use definition of two's complement, ~x = -x - 1)
-(~a + b) - 1 =
(move the 1)
-(~a + b + 1) =
(use definition of two's complement, ~x = -x - 1)
-(-a + b) =
(you know this step)
a - b
person harold    schedule 06.11.2015
comment
ที่สมบูรณ์แบบ ฉันกำลังดิ้นรนกับการลบวงเล็บออกอย่างถูกต้อง ฉันจะอ่านรายละเอียดเพิ่มเติมเกี่ยวกับคำจำกัดความของการลบได้ที่ไหน - person Solar Dia; 07.11.2015
comment
@SolarDia ฉันไม่รู้ แต่ฉันได้เพิ่มข้อพิสูจน์สำหรับเรื่องนั้นด้วย แต่บางทีมันอาจจะกลายเป็นวงกลมเล็กน้อยตอนนี้ .. - person harold; 07.11.2015
comment
ขอบคุณครับ มันไม่กลมและดูสม่ำเสมอมาก คำจำกัดความของการเสริมสอง -› คำจำกัดความของการลบ -› ~(~x + 1) + 1 == x ไม่แน่ใจว่ามันยุติธรรมที่จะทำเช่นนั้นหรือไม่ แต่ฉันชอบแบบนั้น) จะเพิ่มความคิดเห็นนี้เมื่อฉันได้รับชื่อเสียงเพียงพอ - person Solar Dia; 09.11.2015

นี่เป็นเพราะถ้าคุณเพิ่มค่า ~x (สมมติว่าไม่มีการโอเวอร์โฟลว์) จากนั้นแปลงกลับเป็น x คุณจะเพิ่มขึ้นสัมพันธ์กับ ~x แต่ลดลงสัมพันธ์กับ x สิ่งเดียวกันนี้ใช้ในทางกลับกัน สมมติว่าตัวแปร x ของคุณมีค่าเฉพาะ ทุกครั้งที่คุณเพิ่มขึ้น เทียบกับ ~x คุณจะสังเกตเห็นว่ามันลดลง

จากมุมมองของโปรแกรมเมอร์ นี่คือสิ่งที่คุณจะได้เห็น

Let short int x = 1         (0x0001)
then ~x = 65534             (0xFFFE)
~x + 1 =  65534 + 1         (0xFFFF)
~(~x+1) = 0                 (0x0000)
~(~x+1) + 1 = 0 + 1         (0x0001)
person Iancovici    schedule 06.11.2015