在C语言中<<是什么意思?

   更新日期:2024.04.23
先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:

int i = 1;
i = i << 2; //把i里的值左移2位

也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)

需要注意的一个问题是int类型最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:

int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000
i = i << 1;

那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.

左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:

int i = 1, j = 0x80000000; //设int为32位
i = i << 33; // 33 % 32 = 1 左移1位,i变成2
j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃

在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是33%32后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.

总之左移就是: 丢弃最高位,0补最低位

再说右移,明白了左移的道理,那么右移就比较好理解了.

右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.

右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:

int i = 0x80000000;
i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000

就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.

负数10100110 >>5(假设字长为8位),则得到的是 11111101

总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.

例:C语言中左移<<表示乘以2,右移>>表示除以2,这是由计算机工作原理导致的!但是要是7,二进制数为0111,右移一位得3.5,但是右移之后二进制数变成0011,是3。不一样啊,怎模解释呢??

答:移位操作符的两个操作数必须是整型的。整个移位表达式的值的类型也是整型的,而且,左移位操作符与右移位操作符的运算并不对称。0111右移一位是把最后一位的1去掉,左边补个0,得0011,转换为十进制是3,这是正确的。并不等同于除以2 。

<<是左移操作符,将数字的二进制形式按位左移,末尾补零
例如:
对于unsigned int x=015,x<<1,x<<2,x<<3的分析。

unsigned int x=015,
x=015,用0打头的说明是八进制数,由于后面要进行左移操作,所以转换为二进制看比较方便。
015(八进制)=1101(二进制)

<<:这个是左移操作符,按位左移,末尾补零
>>:这个是右移操作符,按位右移,前端补零

x<<1:左移一位,1101(二进制)左移一位变为11010(二进制),11010(二进制) = 26(十进制)
x<<2:左移两位,1101(二进制)左移两位变为110100(二进制),110100(二进制) = 52(十进制)
x<<3:左移三位,1101(二进制)左移三位变为1101000(二进制),1101000(二进制) = 104(十进制)

现在你应该也看出来了,左移N位就相当于原数乘以2的N次方

先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:
int
i
=
1;
i
=
i
<<
2;
//把i里的值左移2位
也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)
需要注意的一个问题是int类型最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:
int
i
=
0x40000000;
//16进制的40000000,为2进制的01000000...0000
i
=
i
<<
1;
那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.
左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:
int
i
=
1,
j
=
0x80000000;
//设int为32位
i
=
i
<<
33;
//
33
%
32
=
1
左移1位,i变成2
j
=
j
<<
33;
//
33
%
32
=
1
左移1位,j变成0,最高位被丢弃
在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是33%32后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.
总之左移就是:
丢弃最高位,0补最低位
再说右移,明白了左移的道理,那么右移就比较好理解了.
右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.
右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:
int
i
=
0x80000000;
i
=
i
>>
1;
//i的值不会变成0x40000000,而会变成0xc0000000
就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.
负数10100110
>>5(假设字长为8位),则得到的是
11111101
总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.
例:C语言中左移<<表示乘以2,右移>>表示除以2,这是由计算机工作原理导致的!但是要是7,二进制数为0111,右移一位得3.5,但是右移之后二进制数变成0011,是3。不一样啊,怎模解释呢??
答:移位操作符的两个操作数必须是整型的。整个移位表达式的值的类型也是整型的,而且,左移位操作符与右移位操作符的运算并不对称。0111右移一位是把最后一位的1去掉,左边补个0,得0011,转换为十进制是3,这是正确的。并不等同于除以2


先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:
int
i
=
1;
i
=
i
<<
2;
//把i里的值左移2位
也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)
需要注意的一个问题是int类型最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:
int
i
=
0x40000000;
//16进制的40000000,为2进制的01000000...0000
i
=
i
<<
1;
那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.
左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:
int
i
=
1,
j
=
0x80000000;
//设int为32位
i
=
i
<<
33;
//
33
%
32
=
1
左移1位,i变成2
j
=
j
<<
33;
//
33
%
32
=
1
左移1位,j变成0,最高位被丢弃
在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是33%32后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.
总之左移就是:
丢弃最高位,0补最低位
再说右移,明白了左移的道理,那么右移就比较好理解了.
右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.
右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:
int
i
=
0x80000000;
i
=
i
>>
1;
//i的值不会变成0x40000000,而会变成0xc0000000
就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.
负数10100110
>>5(假设字长为8位),则得到的是
11111101
总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.
例:C语言中左移<<表示乘以2,右移>>表示除以2,这是由计算机工作原理导致的!但是要是7,二进制数为0111,右移一位得3.5,但是右移之后二进制数变成0011,是3。不一样啊,怎模解释呢??
答:移位操作符的两个操作数必须是整型的。整个移位表达式的值的类型也是整型的,而且,左移位操作符与右移位操作符的运算并不对称。0111右移一位是把最后一位的1去掉,左边补个0,得0011,转换为十进制是3,这是正确的。并不等同于除以2


是一种符号重载,你可以让他干你想做的任何事。
在标准输出中,是输出到控制台的插入符,如cout<<i; 表示将i的值输出到标准输出设备。

  • 18917437972 :C语言中y=x%3.5错在哪里?
    章关姚1560 :答:在C语言中,%运算符仅适用于整数类型,因此对于非整数类型的操作数,例如3.5,会发生错误。因此,表达式y=x%3.5中的3.5是非法的。如果你想使用浮点数,请使用适当的浮点数运算符,例如fmod()。如果你想对一个整数进行...
  • 18917437972 :在C语言程序中,被调用的函数必须在main( )函数中定义 这句话对吗...
    章关姚1560 :答:不对。C语言中函数可以定义在main()函数外面,如下列代码中定义的swap函数,就是在main()函数外面。示例代码:include<stdio.h> void swap(int *a,int *b){ int t;t = *a;a = *b;b = t;} int main(){ ...
  • 18917437972 :在C语言的文件中,像r,w,a,r+,w+,a+分别是什么意思,前面三者与后面三者...
    章关姚1560 :答:若打开的文件已经存在,则将该文件删去,重建一个新文件。若要向一个已存在的文件追加新的信息,用“a”方式打开文件。如果指定文件不存在则尝试创建该文件。以上内容参考:百度百科-c语言fopen函数 ...
  • 18917437972 :在C语言中,“::”是什么?
    章关姚1560 :答:->是一个整体,它是用于指向结构体、C++中的class等含有子数据的指针用来取子数据。换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”...
  • 18917437972 :char在c语言是什么意思?
    章关姚1560 :答:关于char还有一个特殊的语言就是char *,它在C语言中有专门的语义,既不同于signed char *,也不同于unsigned char *,专门用于指以'\0'为结束的字符串。C语言中char的不同应用:1、字符型(char)字符型(char)用于...
  • 18917437972 :在c语言中%3c 是什么意思
    章关姚1560 :答:是C语言中的格式字符,c代表了输出字符类型,3代表了占位情况,%3c的意思是输出一个占位3的字符。式样化规定字符, 以"%"开端, 后跟一个或几个规定字符, 用来确定输出内容式样。
  • 18917437972 :在C语言的头文件中中括号和双引号的在用的时候的区别??
    章关姚1560 :答:在C语言的头文件中中括号和双引号的在用的时候的区别为:编译不同、对象不同、环境不同。一、编译不同 1、头文件中中括号:头文件中中括号编译时会先在系统include目录里搜索,如果找不到才会在源代码所在目录搜索。2、...
  • 18917437972 :c语言中如何输入整数
    章关姚1560 :答:根据需要一般选择如下3种方法:1,已知数量,且个数较少:scanf("%d%d%d",&a&b&c);2,已知数量,但数量较多:for(int i=0;i<n;i++)scanf("%d",&a[i]);3,不知道数量 int i=0;while(scanf("%d",&a[i]...
  • 18917437972 :c语言中,% c是什么意思?
    章关姚1560 :答:d 十进制有符号整数 u 十进制无符号整数 f 浮点数 s 字符串 c 单个字符 p 指针的值 e 指数形式的浮点数 x, %X 无符号以十六进制表示的整数 0 无符号以八进制表示的整数 g 自动选择...
  • 18917437972 :在C语言中c% 和 d% 是表示什么意思?
    章关姚1560 :答:d 表示有符号十进制整数, %c 表示字符。这一类符号是“格式说明”用于格式输入与格式输出,就是我们常见的printf和scanf函数中在输入输出时,对不同类型的数据(如int,float,char等)要使用不同的格式说明。其中%d,用来...
  • 相关链接

    欢迎反馈与建议,请联系电邮
    2024 © 视觉网