天天看點

c語言中 1是真嗎,c – 為什麼(18446744073709551615 == -1)是真的?

18,446,744,073,709,551,615

提到的這個數字,18,446,744,073,709,551,615,實際上是2 ^ 64-1.這裡重要的是2 ^ 64-1基本上是基于0的2 ^ 64.無符号整數的第一個數字是0,而不是1.是以,如果最大值為1,則它有兩個可能的值:0或1(2).

讓我們看看64位二進制中的2 ^ 64 – 1,所有位都打開.

1111111111111111111111111111111111111111111111111111111111111111b

-1

讓我們看看64位二進制中的1.

0000000000000000000000000000000000000000000000000000000000000001b

為了使其在One’s Compliment(OCP)中為負,我們将這些位反轉.

1111111111111111111111111111111111111111111111111111111111111110b

計算機很少使用OCP,他們使用Two’s Compliment(TCP).要擷取TCP,請向OCP添加一個.

1111111111111111111111111111111111111111111111111111111111111110b (-1 in OCP)

+ 1b (1)

-----------------------------------------------------------------

1111111111111111111111111111111111111111111111111111111111111111b (-1 in TCP)

“但是,等等”你問,如果在Twos Compliment -1中,

1111111111111111111111111111111111111111111111111111111111111111b

并且,如果在二進制2 ^ 64 – 1中

1111111111111111111111111111111111111111111111111111111111111111b

然後他們是平等的!而且,這就是你所看到的.您将有符号的64位整數與無符号的64位整數進行比較.在C中,這意味着将有符号值轉換為無符号,編譯器會這樣做.

更新

對于技術更正thanks to davmac in the comments,從-1簽名到相同大小的無符号類型的轉換實際上是在語言中指定的,而不是體系結構的功能.總而言之,您可能會發現上面的答案對于了解支援兩個贊美但沒有確定您可以依賴的結果的規範的語言/語言非常有用.