[英]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 會進行整數提升,但這里~a
是int
類型,不需要額外提升。
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.