但是我写了个循环右移的程序,感觉应该有错才是啊,
这个程序是我用来测试的,输入一个8位的16进制数,把它看成2进制数,为了方便,输入位移的值为4的倍数,问题来了,当我输入98765432 -4,结果为87654329,刚好左移4位,怎么解释第7行代码?当我输入98765432 -36,由于左移36位和左移4位结果是一样的,所以结果还是87654329,但是,很明显第4行不会执行,执行完第6行后,*p和a的值应该为0,所以结果的值,由于98765432是负数,所以执行第9行,结果应该是(-1)<<(32-n),而不是87654329,问题在哪里??这个程序这的很奇怪,位移值为正数,就是循环右移,为负数,就是左移。Tell me why??? I want the key.求高人指点啊。
关于C语言中的左位移和右位移,其右值能为负数吗,我在GNU编译下编译时...
负数是可以用%运算的。也就是当你n=-36的时候和n=-4是一样的。至于你右移用负数个单位。。这个我在VC上测试结果恒为0。。估计是gcc默认负数就成了右移吧。刚才搜了一下,有符号右移貌似在标准中未定义。。所以gcc中估计就是直接把右移负数位(相当于左移)移出的数补到了右边。然后a的话*p...
C语言中 移位 和 按位 和 +-*\/ 的优先级是怎么样的
得已赋值的变量我们称为左值,因为它们出现在赋值语句的左边;产生值的表达式我们称为右值,因为她它们出现在赋值语句的右边。常数只能作为右值。 例如: count=5; total1=total2=0; 第一个赋值语句大家都能理解。 第二个赋值语句的意思是把0同时赋值给两个变量。这是因为赋值语句是从右向左运算的,也就是说从右端...
C语言中 移位 和 按位 和 +-*\/ 的优先顺序是怎么样的
得已赋值的变数我们称为左值,因为它们出现在赋值语句的左边;产生值的表示式我们称为右值,因为她它们出现在赋值语句的右边。常数只能作为右值。 例如: count=5; total1=total2=0; 第一个赋值语句大家都能理解。 第二个赋值语句的意思是把0同时赋值给两个变数。这是因为赋值语句是从右向左运算的,也就是说从右...
C语言中位移位运算符?
有符号的数右移时符号也随着右移;是正数的话在最高位补0,是负数的话,符号位为1,最高位补0还是补1决取于计算机系统的规定。移入0的称为"逻辑右移",移入1的称为“算术左移”。很多系统规定为补1,即“算术右移”。右移运算可以实现除法的功能,右移1位相当于该数除以2,右移n位相当于该...
有关C语言中 a--的问题。答案跟编译器不一样
标准C规定,表达式a++的右值等于a的右值; (a++的右值为原a的右值)++a的右值等于a的右值加1后的值 a++与++a都是先执行 a+1,但前者的右值还不变,要等运行完此语句,a的值才变为原来的值加1,后者是已经改变了a的值 程序分析,程序是顺序执行,先会判断if条件,判断完if条件之后a变为了6,...
c语言语句a > b ? a = 10 : b = 2;中a=10和b=2需要添加括号吗,为什么v...
而(a>b?a=10:b)是一个右值,不能把2赋给它,所以报错。要加括号改成这样才行:a>b?a=10:(b=2);这是一个例子:include <stdio.h> int main(){ int a=2,b=1;a>b?a=6:(b=8);printf("%d,%d\\n",a,b);a=1;b=2;a>b?a=66:(b=88);printf("%d,%d\\n",a,b);return...
c语言中~0表示什么意思 ~运算符怎么运算 ~13等于多少
~0 等于1 ~13等于2 1.在电脑里面无论什么数字都是按二进制储存的,0(1位的十进制数)就储存为0(1位的二进制数),13(2位的十进制数)就储存为1101(4位的二进制数)。2. ~ 就是把二进制形式下的每一位取反(1变0,0变1),所以0(0)就是1(1),13(1101)就是2(0010)。