无符号位移(>>>、<<<) 有符号位移(>>、<<)

无符号位移(>>>)和有符号位移(>>)的区别是

有符号位移运算时如果数字为正数时位移后在前面补0,为负数时则在位移后在前面补1

举例说明最快

以15位例(负数以-15为例)

15的二进制 :00000000 00000000 00000000 00001111

-15的二进制:11111111 11111111 11111111 11110001

计算过程:补码(负数的二进制)=反码+1

反码:11111111 11111111 11111111 11110000

补码(即加1):11111111 11111111 11111111 11110001   也就是-15的二进制

一、正数 (无符号位移>>>)

15>>>2    注:2 移动的位数

15的二进制 :00000000 00000000 00000000 00001111

移动之后 :00000000 00000000 00000000 00000011 (11 舍弃)

计算之后:3

二、正数 (有符号位移>>)

15>>2

15的二进制 :00000000 00000000 00000000 00001111

移动之后:00000000 00000000 00000000 00000011 (11 舍弃)   同(>>>)

计算之后:3

三、负数(无符号位移>>>)

-15>>>2

-15的二进制:11111111 11111111 11111111 11110001

移动之后:00111111 11111111 11111111 11111100 (01舍弃)

这个数好大的,如何计算呢?

2^2+2^3+2^4+...+2^30=1073741820
计算结果:1073741820

四、负数(有符号位移>>)

-15>>2

-15的二进制:11111111 11111111 11111111 11110001

移动之后:11111111 11111111 11111111 11111100 (01舍弃)
补码(负数的二进制)=反码+1
先减1:11111111 11111111 11111111 11111011
反码:00000000 00000000 00000000 00000100 (此结果为4)
计算结果:-4

五、总结(不全面、不绝对)

15>>>2=3
15>>2=3
-15>>>2=1073741820
-15>>2=-4
当需要移位的数为正数时,有符号位移(>>)和无符号位移(>>>)是相同的。
当需要移位的数为负数时,有符号位移(>>)的结果 还为负数,无符号位移(>>>)的结果为正数。

时间: 2024-10-26 10:03:45

无符号位移(>>>、<<<) 有符号位移(>>、<<)的相关文章

【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

原文:[ c语言中无符号和有符号的加法运算][深入理解]--[sky原创] 第一题 #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n",a+b); (a+b)>6? puts(">6"):puts("<=6"); return 0; } 答案是:>6 第二题 #include<stdio.h> int m

linux shell中的比较符号与特殊符号介绍

shell字符串比较.判断是否为数字  二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.  整数比较  -eq 等于,如:if [ "$a" -eq "$b" ]  -ne  不等于,如:if [ "$a" -ne "$b" ]  -gt 大于,如:if [ "$a" -gt "$b" ]  -ge 大于等于,如:if [  "$a" -ge "

关于C语言中的强符号、弱符号、强引用和弱引用的一些陋见,欢迎指正

首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样感觉的朋友交流也希望高人指点. 首先我们看一下书中关于它们的定义. 引入场景:(1)文件A中定义并初始化变量i(int i = 1), 文件B中定义并初始化变量i(int i = 2).编译链接A.B时会报错b.o:(.data+0x0): multiple definition of `i':a.o:(.d

浅谈C语言中的强符号、弱符号、强引用和弱引用

摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014-10-31 我要评论 这篇文章主要介绍了C语言中的强符号.弱符号.强引用和弱引用的定义及相关内容,非常的简单易懂,有需要的朋友可以参考下 首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑

程序猿之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)

主要内容:无符号和有符号之间转换.两数相加溢出后数值计算 #include <stdio.h> /* 这个函数存在潜在漏洞 */ float sum_elements(float a[], unsigned length) { int i; float result = 0; for(i = 0; i <= length - 1; i++) { result += a[i]; printf("a[%d] = %f \n",i,a[i]); } return resul

程序员之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)

主要内容:无符号和有符号之间转换.两数相加溢出后数值计算 #include <stdio.h> /* 这个函数存在潜在漏洞 */ float sum_elements(float a[], unsigned length) { int i; float result = 0; for(i = 0; i <= length - 1; i++) { result += a[i]; printf("a[%d] = %f \n",i,a[i]); } return resul

符号管理之符号表

在符号表模块输出一个符号表类型Table和各种能符号表的实例 其中实例包括: Table constants Table externals Table identifiers Table globals Table types Table labels; 其中types表在第四章类型中会涉及 上述符号表的子集实现了ANSI  C的三种名字空间.identifiers保存一般的标识符:externals存放声明为extern的标识符,用于警告外部标识符声明冲突globals是identifier

解决 “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏;使用“rename”限定符 类型库符号与系统符号冲突问题

今天在VS工程当中引入一个组件,编译的时候出现警告, “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏:使用“rename”限定符.虽然只是一个警告,但看着实在不爽,更重要的是,警告在某些情况下,可能正是bug的来源,并且这类bug往往非常难以定位.废话不多话,下面来解决问题. 看编译器给出的提示,是告诉我们,类型库当中的符号和系统符号有重名,同时也给出了解决方法,就是使用rename.怎么个rename法呢?其实很简单,我们在导入类型类的时候,直接#import语句后面,通过

C语言中的强符号与弱符号

注意,强符号和弱符号都是针对定义来说的,不是针对符号的引用. 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号. 对于它们,下列三条规则使用: ① 同名的强符号只能有一个,否则编译器报"重复定义"错误. ② 允许一个强符号和多个弱符号,但定义会选择强符号的. ③ 当有多个弱符号相同时,链接器选择占用内存空间最大的那个. 二.哪些符号是弱符号? 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中含有相同名字全局符号的定义,那么

GCC中的弱符号与强符号

我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误.比如我们在目标文件A和目标文件B都定义了一个全局整形变量global,并将它们都初始化,那么链接器将A和B进行链接时会报错: [html] view plain copy 1 b.o:(.data+0x0): multiple definition of `global' 2 a.o:(.data+0x0): first defined here 这种符号的