C 中移位运算符的类型
在本文中,我们将了解移位运算符,它们是对变量值的位进行的按位运算符的类型。 有两种类型的移位运算符:左移位运算符和右移位运算符。
让我们来看看这些运算符。
C 中的移位运算符
左移运算符的特征是 <<
符号,右移运算符的特征是 >>
符号。 这些运算符是二元的,要求运算符两边都有两个操作数,而且都必须是整数。
右移算术运算符的语法如下:
n >> m ;
我们将 n 中的值向右移动 m 位。 这里,n和m是整数。
C 中移位运算符的类型
在 C 中只有一个右移运算符 >>。C 编译器根据要移位的整数类型来选择使用哪个右移。
带符号整数移位时使用算术移位,无符号整数移位时使用逻辑移位。
在这两种情况下,无符号左移或右移都会发生逻辑移位,但我们不能在有符号整数值的情况下使用逻辑移位。 逻辑移位可以改变符号,所以我们可以使用算术移位来解决这个问题。
所以在右算术移位中,MSB(符号位)被复制并右移。 效果是除以二。
有符号数的语法:
n1=-n2;
n1>>m1;
在有符号整数的情况下,将第一位存储在空槽中,并在移位期间将副本移动到下一个。
算术和逻辑左移是相同的。 对于负值,只有右移不同。
因此,对有符号值进行右移的程序本质上是不可移植的。
将一个值右移 n 位时,它会将值除以 2 的 n 次方,将值左移 n 位时将值乘以 2 的 n 次方。
示例代码:
#include <stdio.h>
int main(void)
{
int dd = -15;
int ee = 15;
printf("value of dd right(sign bit) shift by 1 bits, is %d\n", dd>>1);
printf("value of dd right shift(sign bit) by 2 bits, is %d\n", dd>>2);
printf("value of dd right shift(sign bit) by 3 bits, is %d\n", dd>>3);
printf("value of dd right shift by 4 bits, is %d\n", dd>>4);
printf("value of ee right shift by 1 bits, is %d\n", ee>>1);
printf("value of ee right shift by 2 bits, is %d\n", ee>>2);
printf("value of ee right shift by 3 bits, is %d\n", ee>>3);
return 0;
}
在上面的 C 示例代码中,我们将使用 #include <stdio.h>
作为库头文件,其中包含有关在我们的程序中包含输入或输出相关函数(例如 printf()
和 scanf()
函数)的信息 .
main函数是程序执行的起点。 操作系统通过调用 main 函数启动程序执行。
以下两个变量 dd 和 ee 由两个不同的符号值(正值和负值)初始化。 然后在 printf() 函数中分别简单地进行 1、2 和 3 个数字的移位过程,符号值 ee 相同。
当对负数进行算术右移时,符号位被移位并复制到移位期间创建的空槽中,如上例所示。 对于给定的时间,两个值都向右移动,有符号数和无符号数。
在无符号数中,移位是合乎逻辑的。 它在包含值 15 的 ee 变量中表示,该值向右移动 1 位、2 位和 3 位。
它表明将值除以 2 提高了数字(位)的幂,例如,移动 1 位是 15/2^1,等于 7。
在有符号值移位中,第一位值复制自身用于移位,并在移位期间将其存储在空槽中。
输出:
无符号和有符号值的右移很简单; 空位用零填充。 对于负值,右移的结果是实现定义的。
我们将在下面的示例中使用偶数来查看结果并了解右移运算符在偶数和奇数有符号数中的工作原理。 让我们看看下面给出的代码。
#include <stdio.h>
int main(void)
{
int dd = -16;
int ee = 16;
printf("value of dd right(sign bit) shift by 1 bits, is %d\n", dd>>1);
printf("value of dd right shift(sign bit) by 2 bits, is %d\n", dd>>2);
printf("value of dd right shift(sign bit) by 3 bits, is %d\n", dd>>3);
printf("value of dd right shift by 4 bits, is %d\n", dd>>4);
printf("value of ee right shift by 1 bits, is %d\n", ee>>1);
printf("value of ee right shift by 2 bits, is %d\n", ee>>2);
printf("value of ee right shift by 3 bits, is %d\n", ee>>3);
return 0;
}
输出:
总结
结论是逻辑移位(符号位)导致右移出现数号符号变化问题,可以在算术右移运算符中控制。 C 和 C++ 只有算术移位,一些区域未定义和实现定义。
相关文章
在 C 语言中使用 typedef enum
发布时间:2023/05/07 浏览次数:181 分类:C语言
-
本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。
C 语言中的 extern 关键字
发布时间:2023/05/07 浏览次数:114 分类:C语言
-
本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量
C 语言中的 #ifndef
发布时间:2023/05/07 浏览次数:186 分类:C语言
-
本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。