c语言的位运算疑惑

#include<stdio.h>
main()
{char x=040;
printf("%d\n",x=x<<1);
}
的运算结果为什么是64啊,在线求解

恩。分析下思路。先针对你的这个题目。
1:040 是八进制的表示。换成十进制是 4*8+0*1=32
2:ASCII编码表中 32表示的是空格符号。 char中寸的是ASCII编码,所以是32
3:位移运算:>>表示右移位
我以8为例。8的二进制是1000, 8>>1对应的二进制形式就是1000——0100看到变化了没有。
所以右移位相当于这个数除2
左移位你看看 01000——10000是16了。相当扩大一倍。
32的二进制是 0010 0000左移1位 01000000你看看是不是64
4:最后打印的是%d,所以是数字。而不是字符

希望你能明白!打字好累啊!
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-23
char c=040即整数32;左移一位相当于乘法*2^1,所以为64.只要知道一位运算其实是乘法和除法,自己类比一下十进制后面加几个0,减几个0,其实就是移位。
第2个回答  2012-03-23
x=040,是八进制的表示方法,也就是x=32,x<<1就是将它的二进制左移一位,也就相当于乘以了2,所以昌64
第3个回答  2012-03-23
040是八进制数,转化为十进制为32。x=x<<1意思是将x左移移位,左移一位在十进制角度为变为原来的2倍,即32*2=64.追问

八进制能不能直接进行位运算啊,就是不通过转换成十进制和二进制进行位预算,感觉八进制转化成二进制太复杂了

第4个回答  2012-03-23
因为你的x =040,代表x是一个八进制的数,040相当于十进制的32,移位之后就是64了

c语言的位运算疑惑
1:040 是八进制的表示。换成十进制是 4*8+0*1=32 2:ASCII编码表中 32表示的是空格符号。 char中寸的是ASCII编码,所以是32 3:位移运算:>>表示右移位 我以8为例。8的二进制是1000, 8>>1对应的二进制形式就是1000——0100看到变化了没有。所以右移位相当于这个数除2 左移位你看看 010...

c语言位运算问题?
c语言位运算问题解答:要解答这个问题我们先来看一个例子,代码如下图一,图中右边是问题中得到代码,左边是这段代码的汇编指令。两种情况的不同点详细说明如下:第一种情况:printf("%d",2>>64);由图中的汇编代码可以看出,如果两个数都是常数的情况下,代码中是不含对应的汇编指令的,因为编译器...

c语言位运算-3>>2,为什么是-1
-3的二进制表示为 1000 0011 符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.

C语言中位运算符问题 这句话怎么解释啊
这句话的理解有这样一个基础,那就是右移n位相当于除以2的n次方,而这个基础就是对于无符号数来说的。比如无符号数8,如果用8位二进制表示,就是二进制的0000 1000,右移0位,也就是不移动,等于8,就等于8除以1,也就是8除以2的0次方;右移1位,0000 0100 ,等于4,就等于8除以2,也...

C语言问题,在位运算中,操作数每右移一位,其结果相当于什么?若左移1位...
1、右移,除以2右移n位除以2的n次方;右移的概念和左移相反,就是往右边挪动若干位,运算符是>>;右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:inti=0x80000000;i=i>>1;\/\/i的值不会变成0x40000000,而会变成0xc0000000 2、左移,乘以2...

C语言位运算取反问题?
首先你输出是肯定用的 printf("%d",~a).int类型数据是有范围的 -32768~32767 [100]原=0000 0000 0110 0100 取反后为1111 1111 1001 1011 这个数值已远远超出了范围,发生溢出.但是这个数值是-101的补码,而计算机数字都是按补码存储的,所以他输出了-101.你放成ld,数值又不同....

c语言位运算问题9 |5为什么等于13如下图
c 可以把输入的数字按照ASCII码相应转换为对应的字符;d 接受整数值并将它表示为有符号的十进制整数;2d 那个数字2,用于控制显示数值的宽度,不够以空格填充;9|5表达式 | 是位或运算符,运算规则如下:1|1=1;0|1=1;1|0=1;0|0=0;9的二进制形式: 00001001 5的二进制...

c语言位运算左位移问题。
不对吧,左移应该是整体向左边移动,如y=x<<2,就是x的左边去掉2位,后边补2个0,结果应该是:01001100

关于C语言位运算,赋值的问题,回答详细一点。为什么按位取反后输出的结 ...
2的二进制是00000010,取反得到11111101,最高位为1,说明这是个负数的补码。负数的补码,是由其绝对值的原码取反加1得到,反过来,将负数的补码减1取反,就得到其绝对值的原码。11111101-1=11111100,再取反得到00000011,即十进制的3。也就是说该负数的绝对值为3,那么这个负数为-3。所以第一个值...

有关C语言位操作的问题: 1&0=0要怎么理解。。符号&不懂
&是位与,与之相似的有逻辑与&& 两个操作数进行位与操作时,先把操作数化成二进制数,然后每一位进行与操作,当对应的位同时为1时,结果为1,否则为0,题目是1&0,两个操作数都很简单,不用化成二进制数都知道答案,因为前面的位都是0,最后的位,一个为1,一个为0,所以结果为0,另举一例...

相似回答