迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

C 中移位运算符的类型

作者:迹忆客 最近更新:2023/05/05 浏览次数:

在本文中,我们将了解移位运算符,它们是对变量值的位进行的按位运算符的类型。 有两种类型的移位运算符:左移位运算符和右移位运算符。

让我们来看看这些运算符。


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。

在有符号值移位中,第一位值复制自身用于移位,并在移位期间将其存储在空槽中。

输出:

Right Shift - Output

无符号和有符号值的右移很简单; 空位用零填充。 对于负值,右移的结果是实现定义的。

我们将在下面的示例中使用偶数来查看结果并了解右移运算符在偶数和奇数有符号数中的工作原理。 让我们看看下面给出的代码。

#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;
}

输出:

Right Shift - Output 2


总结

结论是逻辑移位(符号位)导致右移出现数号符号变化问题,可以在算术右移运算符中控制。 C 和 C++ 只有算术移位,一些区域未定义和实现定义。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便