簡體   English   中英

為什么按位運算符(~)的序列會是這樣? 那是壞了嗎?

[英]Why the sequence from the bitwise operator(~) would be this? Is that broken?

#include <stdio.h>
#include <stdlib.h>

int main() {
unsigned char a=100,b=50;

printf("%d & %d = %d\n",a,b,a&b);
printf("%d | %d = %d\n",a,b,a|b);
printf("%d ^ %d = %d\n",a,b,a^b);
printf(" ~%d = %d\n",a, ~a);       /*the out come of this  line would be this: ~100 = -101 */
printf(" %d >> 2= %d\n",a, a>>2);
printf(" %d << 2= %d\n",a, a<<2);
system("pause");
return 0;
}

/結果應該是 155,不是嗎? /

按照標准, ~的操作數會進行整數提升。 所以這里我們首先將a提升為int

[expr.unary.op] : ~ 的操作數應具有整數或無范圍枚舉類型; 結果是其操作數的補碼。 進行積分促銷。

如果int是 4 個字節(例如),則提升a值為0x00000064 ~a的結果是0xFFFFFF9B ,正好是-101 (如果使用二進制補碼表示整數)。

請注意,雖然 variadic arguments 會進行整數提升,但這里~aint類型,不需要額外提升。

100 = 0x64
~0x64 = 0x9B

printf(" ~%d = %d\n",a, ~a); ,第二個格式說明符%d需要一個帶signed integer ,因此結果0x9B將擴展為帶signed integer 0x9B的 MSB 為 1,因此被視為negative value

0x9B ---extends to>>> 0xFFFFFF9B = -101

如果您希望結果為155 ,則需要unsigned轉換,以便0x9B將擴展為0x0000009B

#include <stdio.h>

int main() {
  unsigned char a = 100, b = 50;

  printf(" ~%d = %d\n", a, ~a);
  printf(" ~%d = %d\n", a, (unsigned char)~a);

  return 0;
}

這將給出結果:

gcc test.c
./a.out

 ~100 = -101
 ~100 = 155

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM