[英]difficulty understanding signed not
我在理解為什么c在以下程序中等於-61時遇到問題:
main() {
unsigned int a = 60; // 60 = 0011 1100
unsigned int b = 13; // 13 = 0000 1101
int c = 0;
c = ~a; //-61 = 1100 0011
printf("Line 4 - Value of c is %d\n", c );
}
我確實了解NOT運算符如何在0011 1100上工作(解決方案為1100 0011)。 但是我不確定為什么十進制數會增加1。這是從unsigned int(從a)到signed int(從c)的某種類型轉換嗎?
從正數到負數的二進制補碼轉換(標准帶符號格式)構成按位求反,然后加一個。
請注意,為簡單起見,我使用一個帶符號的字節。
So if 60 = 0011 1100
Then c = 1100 0011 + 1
= 1100 0100
對於帶符號字節,最高有效位為負,因此
c = -128 + 64 + 4 = -60
您需要加1來考慮以下事實:最高有效位是-128,而最大正數是0111 1111 =127。對於-128,所有負數都有1,需要偏移。
當您將0轉換為-0時,這很容易看到。 反轉00000000,得到11111111,加1則返回00000000。對1到-1執行相同操作,則得到11111111-可能的最大負數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.