unsigned char b =( ~a) >> (1 + 2 + 3); printf("%d\n", b); 这段代码为什么输出的是253

位取反优先级不是高右移吗?求大神指点!!!
char a=0x5a;

这与a的值有关,不一定是253。

追问

不好意思上面写错了,是当char a=0xa5;
unsigned char b =( ~a) >> (1 + 2 + 3); printf("%d\n", b);
为什么输出的是253

追答

0xa5就是10100101,~a就是01011010,01011010>>6应该得到1才对,得出253即11111101,显然是把最位用1继承下来了。我觉得这可能是编译器的bug(其实C编译器的bug是很多的)。我的根据是用以下代码应该是等同的,但输出就“有道理”了:

#include "stdio.h"
int main(void){
    unsigned char a=0x55,b,c;
    c=(~a);//对a按位取反赋给c
    b=(c)>>(1+2+3);//用c代替~a
    printf("%d\n",b);//输出是2,对了
    return 0;
}

温馨提示:内容为网友见解,仅供参考
无其他回答

...char a=0xa5; unsigned char b=~a >>1+2+3; 求b等于多少? 请写出...
然后我把代码改了下 include "stdio.h"int main(int argc, char const *argv[]) { unsigned char a = 0xa5; printf ( "%0x", ~a ); \/\/显示ffffff5a unsigned char b = (~a) >> ( 1 + 2 + 3); printf ( "\\n%0x %0x", b, 0xffffff5a >> 6 ); \/...

C语言unsigned char x=-1;printf("%d\\n",x);为何输出会是255?
所以,当使用unsigned char 即无符号整数时,-1用补码表示即1111 1111,十六进制表示为0xff ,十进制表示即为255。

unsigned char x,y=2 printf ("%d\\n",x)
unsigned char x,y=2 printf ("%d\\n",x) unsignedcharx,y=2printf("%d\\n",x)printf("%d\\n",~y)输出的答案为253和-3,为什么第二个是-3啊... unsigned char x,y=2printf ("%d\\n",x)printf("%d\\n",~y)输出的答案为253和-3,为什么第二个是-3啊 展开  我来答 分享 微信扫一扫 新...

这个程序的运行结果是怎样的?
main(){unsigned char a=0xA5; \/\/无符号16进制数a5,二进制就是10100101 unsigned char b=~a>>4+1; \/\/ 先算术,后移位,最后位运算等价于 b = ~(a >> (4+1)) \/\/ b = ~(a >> 5) = ~( 00000101)=(11111010)printf("%d",b); \/\/ 输出格式为%d,为无符号数,按照补...

...main() { unsigned char a,b; a=35; b=~a; printf("%x\\n",b...
dc

求教c语言 unsigned char c=-3; printf("%d\\n",c);
unsigned char表示8位无符号整型数,-3的补码形式为0xFD(二进制的11111101),将它看成无符号整形数则为253。262最后得到6是因为262实际上是无法用8位来表示的,这时候编译器会给个Warning说过大了。实际上它会将多出来的字节丢掉,只保留最右边8个字节,也就是0x06 (二进制的262为100000110,有9...

为何signed char和unsigned char x=-1printf("%d\\n",x)
-1在存储时,第一位是符号位,-用1表示,负数用补码存储,因此-1,存储的时候计为11111111。第一个有符号,读出为-1;第二个为无符号,此时8位都为数字位,读为255。

对于以下代码: char ch = -1; printf(\\"%d\\\\n\\", ch); 输出结果是?
选择B,C中 char,字符,默认unsigned,占一个字节,题中以%d输出,可以转换

main () { unsigned char a=2,b=4,c=5,d;d=a|b; d&=c; printf('%d\\n...
|按位或,d=a|b; 表示“d=2|4=0010|0100=0110=6”,d&=c表示“d=d&c=6&5=0110&0101=0100=4”;所以输出“d”,即使输出“4”

...unsigned char a=8,c; c=a>>3; printf("%d\\n",c); } 程序
要是你想赋值字符8的话得用 ‘8’ (单引号) 否则8就表示数字8

相似回答