C语言中位运算符问题 这句话怎么解释啊

如题所述

这句话的理解有这样一个基础,那就是右移n位相当于除以2的n次方,而这个基础就是对于无符号数来说的。
比如无符号数8,如果用8位二进制表示,就是二进制的0000 1000,
右移0位,也就是不移动,等于8,就等于8除以1,也就是8除以2的0次方;
右移1位,0000 0100 ,等于4,就等于8除以2,也就是8除以2的1次方;
右移2位,0000 0010 ,等于2,就等于8除以4,也就是8除以2的2次方;
右移3位,0000 0001 ,等于1,就等于8除以8,也就是8除以2的3次方;
对于有符号数,最高位为符号位,>> 右移运算,移动的时候符号位会被同时移动。

比如有符号数的-8,如果用8位二进制补码表示,就是二进制的 1111 1000,
右移0位,也就是不移动,等于-8,就等于8除以1,也就是8除以2的0次方;
右移1位:
如果补1进来, 1111 1100 ,等于-4, 就等于8除以2,也就是8除以2的1次方;
如果补0进来, 0111 1100 ,等于124,就不等于8除以2了;

右移2位,0000 0010 ,等于2,就等于8除以4,也就是8除以2的2次方;
如果补1进来, 1111 1110 ,等于-2, 就等于8除以4,也就是8除以2的2次方;
如果补0进来, 0011 1110 ,等于62,就不等于8除以4了;

右移3位,0000 0001 ,等于1,就等于8除以8,也就是8除以2的3次方;
如果补1进来, 1111 1111 ,等于-1, 就等于8除以8,也就是8除以2的3次方;
如果补0进来, 0001 1111 ,等于31,就不等于8除以8了;

根据以上分析,对于带符号数负数,发现右移时有两种情况:补1(也就是符号位)进来,还能够保持除以2的n次方的关系成立;补0进来就不行。
不同的C编译系统根据自己的特点在这个问题上可能就采取了不同的办法。比如VC和DEV C++,对于带符号数的右移运算就采取了补符号位的方式。
温馨提示:内容为网友见解,仅供参考
第1个回答  2016-11-22
当x为负数时,由于符号位为1,右移时,DEV C++系统是规定最高位补1。
例如,-8=11111000B
-8>>2=11111110B
即-8>>2=-2,满足了与正数同样的运算结果,即x>>2的值,等于x/(2^2)。
+8>>2=+2
00001000 >>2 ==> 00000010本回答被网友采纳

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

c语言位运算问题?
printf("%d",i>>64);此时i是个变量,编译器没法在编译时算出结果,这时就需要通过SARL算术右移指令进行,这里考虑到溢出这个指令有一个调整机制,它会根据左操作数i类型来调整右操作数,比如这里i是4字节32位,也就是它最多右移32位,如果右操作数大于32它会进行64%32=0,所以i>>64相当于i>>...

c语言位运算
C语言中的位运算符用于操作二进制位。这些运算符直接对整数的二进制位进行操作,是低级语言操作的重要组成部分。它们对于优化程序性能、实现特定功能非常关键。具体的位运算符 1. 位移运算符:这两个运算符用于将二进制位向左或向右移动指定的位数。例如,`x << 2`表示将x的二进制表示向左移动两位,...

C语言位运算
位运算符中除∽以外,均为二目(元)运算符,即要求两侧各有一个运算了量。2、运算量只能是整形或字符型的数据,不能为实型数据。 “按位与”运算符(&) 规定如下:0&0=0 0&1=0 1&0=0 1&1=1 例:3&5=?先把3和5以补码表示,再进行按位与运算。3的补码: 000...

C语言——位运算
对带符号数进行位运算。按位或运算符对无符号数进行逻辑或运算,对带符号数进行位或运算。按位异或运算符对无符号数进行逻辑异或运算,对带符号数进行位异或运算。通过这些位运算,程序员可以高效地执行操作,特别是对于位级上的数据处理。它们在算法、加密和位级优化中应用广泛。

C语言 按位运算 的复合赋值运算符 问题
位运算符& :是按位进行'与'位运算符| :是按位进行'或'&的作用:【只有两个位都是1,运算结果才为1】;否则为0 1&1 = 1 1&0 = 0 0&0 = 0 |的作用:【只要有一个位是1,运算结果就为1】;否则为0(两个位都为0时)1|1 = 1 1|0 = 1 0|0 = 0 你能明白&运算,那|...

C语言位运算符
在C语言的世界里,位操作符是程序员手中不可或缺的工具,它们犹如二进制代码中的魔术师,对整型数据(char, short, int, long)的底层位进行精细操控。这里有六位小能手,它们分别是:1. 按位与(&): 仿佛是两位二进制数的亲密对话,只有当两个对应位都是1时,结果才会亮起1的灯。它在清零和取...

C语言问题,在位运算中,操作数每右移一位,其结果相当于什么?若左移1位...
例如:inti=0x80000000;i=i>>1;\/\/i的值不会变成0x40000000,而会变成0xc0000000 2、左移,乘以2左移n位乘以2的n次方;先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符。例如:inti=1;i=i<<2;\/\/把i里的值左移2位 左移就是:丢弃最高位,0补最低位 ...

c语言位运算符的用法
一、位运算符C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。 例如:9&5可写...

C语言中的取反与移位运算符的问题
C++中的位运算符,只能用于int和unsigned int类型的,宽度小于int的会被隐式转化成int。左移当然没问题,因为截断的时候用不到高位,右移的时候,高位的1被截到b中,造成无论移位和取反的顺序,结果都是一样的。include <stdio.h> include <stdlib.h> int main(){ unsigned char a=0x11;unsigne...

相似回答