补码

计算机逻辑运算总结

纵然是瞬间 提交于 2020-04-07 11:52:10
在计算机二进制中,最高位表示符号位,若为0表示正数,若为1表示负数。同时我们需要清楚知道原码、反码、补码的概念,这里请自行了解。 取非/反(~): 在二进制补码中,要获取数字的负数,需反转所有位并加1。比如(~-5),5是00000101,那么-5则是:11111010 + 00000001 = 11111011,然后再取(~)是00000100,所以结果为4。若是正数,则其补码是其本身,比如(~5),5是00000101,那么直接取(~),所以结果为11111010,其实这个值就是6的补码即-6。比如如下例子: ~(- 3 ) = 2 ~(- 2 ) = 1 ~(- 1 ) = 0 ~ 0 = - 1 ~ 1 = - 2 ~ 2 = - 3 由上我们可总结出:~ x = - x - 1。 左移(<<):给定数据乘以2的位数次幂。例如11<<2(11 * 2^2 = 44) 有符号右移(>>):进行向右移位后,将最左边的符号位(Most Significant Bit MSB)填充到最左边的位,这称为符号扩展,当向右移动负数时,它可以保留负号的符号。若为正数,则结果为给定数据除以2的位数次幂并舍去模。例如11>>2(11/2^2 = 2),若为负数,则结果为根据正数的结果取负数并减1,也就是(-x-1)。 无符号右移(>>>):有符号右移保留符号位

计算机逻辑运算总结

帅比萌擦擦* 提交于 2020-04-07 08:06:09
在计算机二进制中,最高位表示符号位,若为0表示正数,若为1表示负数。同时我们需要清楚知道原码、反码、补码的概念,这里请自行了解。 取非/反(~): 在二进制补码中,要获取数字的负数,需反转所有位并加1。比如(~-5),5是00000101,那么-5则是:11111010 + 00000001 = 11111011,然后再取(~)是00000100,所以结果为4。若是正数,则其补码是其本身,比如(~5),5是00000101,那么直接取(~),所以结果为11111010,其实这个值就是6的补码即-6。比如如下例子: ~(- 3 ) = 2 ~(- 2 ) = 1 ~(- 1 ) = 0 ~ 0 = - 1 ~ 1 = - 2 ~ 2 = - 3 由上我们可总结出:~ x = - x - 1。 左移(<<):给定数据乘以2的位数次幂。例如11<<2(11 * 2^2 = 44) 有符号右移(>>):进行向右移位后,将最左边的符号位(Most Significant Bit MSB)填充到最左边的位,这称为符号扩展,当向右移动负数时,它可以保留负号的符号。若为正数,则结果为给定数据除以2的位数次幂并舍去模。例如11>>2(11/2^2 = 2),若为负数,则结果为根据正数的结果取负数并减1,也就是(-x-1)。 无符号右移(>>>):有符号右移保留符号位

信息的表示和处理(整数部分)

别等时光非礼了梦想. 提交于 2020-04-06 13:50:09
这里通过分析一个练习题来总结: 考虑下列代码,这段代码试图计算数组a中所有元素的和,其中元素的数量由参数length给出。 /* WARNING: This is buggy code */ float sum_elements(float a[], unsigned length) { int i; float result = 0; for (i = 0; i <= length - 1; i++) result += a[j]; return result; } 当参数length等于0时,运行这段代码应该返回0.0。但实际上,运行时会遇到一个内存错误。请解释为什么会发生这样的情况,并且说明如何修改代码。 解: 首先我们发现参数length的形式参数的类型为unsigned,是一个无符号数,而无符号数是非负的,比如一个字节可以表示的无符号数范围是0~255,在代码中如果参数length等于0,则在循环中会首先对length减1来判断,而这个结果并不是一个负数,而是一个很大的正数。举个例子,对于一个字节,我们这里用十六进制来表示方便一点,0的十六进制为0x00,而0 - 1会得到0xFF,这个数表示为无符号数的大小为255,也就是一个字节所能表示的最大无符号数,这就产生了错误,但是如果我们用有符号数来解读0xFF,此时这个数的大小为-1,就正确了

信息的表示和处理(整数部分)

房东的猫 提交于 2020-04-05 19:10:32
这里通过分析一个练习题来总结: 考虑下列代码,这段代码试图计算数组a中所有元素的和,其中元素的数量由参数length给出。 /* WARNING: This is buggy code */ float sum_elements(float a[], unsigned length) { int i; float result = 0; for (i = 0; i <= length - 1; i++) result += a[j]; return result; } 当参数length等于0时,运行这段代码应该返回0.0。但实际上,运行时会遇到一个内存错误。请解释为什么会发生这样的情况,并且说明如何修改代码。 解: 首先我们发现参数length的形式参数的类型为unsigned,是一个无符号数,而无符号数是非负的,比如一个字节可以表示的无符号数范围是0~255,在代码中如果参数length等于0,则在循环中会首先对length减1来判断,而这个结果并不是一个负数,而是一个很大的正数。举个例子,对于一个字节,我们这里用十六进制来表示方便一点,0的十六进制为0x00,而0 - 1会得到0xFF,这个数表示为无符号数的大小为255,也就是一个字节所能表示的最大无符号数,这就产生了错误,但是如果我们用有符号数来解读0xFF,此时这个数的大小为-1,就正确了

C语言之位运算

二次信任 提交于 2020-04-03 22:17:03
位运算 1).定义. 指的是1个二进制数据的每一位来参与运算. 位运算的前提: 是这个数必须是1个二进制. 注意: a). 参与位运算的二进制数据必须是补码形式. b). 位运算的结果也是二进制的补码形式. 2).按位与: & 参与按位与的两个二进制数.如果都为1 那么结果就为1 只要有1位为0 那么结果就为0. 3 & 2; 第1步骤:先得到两个数的二进制补码形式. 3的补码: 00000000 00000000 00000000 00000011 2的补码: 00000000 00000000 00000000 00000010 ------------------------------------------------------- 00000000 00000000 00000000 00000010 2 -3 & 4; -3的原码:10000000 00000000 00000000 00000011 -3的反码:11111111 11111111 11111111 11111100 -3的补码:11111111 11111111 11111111 11111101 4的补码: 00000000 00000000 00000000 00000100 ------------------------------------------------------

总结上课知识点,(新手,请多多指教)

守給你的承諾、 提交于 2020-04-02 15:01:51
//基本内置类型 //char //字符数据类型 //short //短整型 //int //整形 //long //长整型 //long long //更长的整形 //float //单精度浮点数 //double //双精度浮点数 //基本类型归类 // //1整形 //char //unsigned char //signed char //short //unsigned short[int] //signed short[int] //int //unsigned int //signed int //long //unsigned long[int] //signed long[int] //2浮点数家族 //float //double //3构造类型 //> 数组类型 //> 结构体类型 struct //> 枚举类型 enum //> 联合类型 union //4指针类型 //int pi; //char pc; //float pf; //void pv; //5空类型 //void 表示空类型(无类型) //通常应用于函数的返回类型、函数的参数、指针类型 //原码,反码,补码 //1对于负数而言: //原码:直接将二进制按照正负数的形式翻译成二进制就可以。 //反码:将原码的符号位不变,其他位依次按位取反就可以得到了。 //补码:反码 + 1就得到补码。 /

计算机基础

你离开我真会死。 提交于 2020-03-22 09:40:08
一,int类型在内存是如何存储的? 数据类型  占用字节数  取值范围  int     4byte   -2^31 ~ 2^31-1 unsigned int  4byte   0 ~2^32 1,占用的比特位数 int占用4个字节,每个字节有8个比特位,所以有32个 0-1 的二进制位数。注意:int类型有正负号,unsigned int 没有正负,所以int要用一位来标识正负 2,符号的表示方法 int类型占用的比特位中,左起第一个位(最高位)就是符号位。0表示正数,1表示负数。其余后面31是数值位。 3,数字0怎么表示? 3.1,因为有了正负数,那么就会有 +0 和 -0 。(注意:0有了两种表示:+0,-0)   +0的表示方法:0000 0000 0000 0000 0000 0000   -0的表示方法:-2^31   0就用 +0 的表示方法 3.2,正数部分 2^31-1 ,之所以要减一,就是因为数字0占用了 +0 。负数不需要表示0,-0 就用来表示 -2^31 3.3,int类型的数字 -1 ,在内存中32个比特位上该如何表示? 10000000 00000000 00000001 左边第一个1表示负号,后面31位表示数值部分“1”。----> 然而,并不是这样的 二,补码 计算机中的符号数有三种表示方法:原码,反码,补码

负数的二进制表示

邮差的信 提交于 2020-03-18 17:35:53
3 月,跳不动了?>>> 计算机中,所有数据最终都是使用二进制数表达。 如何将一个10进制数如何转换为二进制数以及如何将如何将一个16进制数如何转换为二进制数,详见下图。 假设有一个 int 类型的数,值为5,那么,我们知道它在计算机中表示为: 00000000 00000000 00000000 00000101 5转换成二进制:101,不过int类型的数占用4字节(32位),所以前面填了一堆0。 现在想知道,-5在计算机中如何表示? 在计算机中,负数以其正值的补码形式表达 什么叫补码呢?这得从原码,反码说起。 原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。 比如 00000000 00000000 00000000 00000101 是 5的 原码。 反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。 取反操作指:原为1,得0;原为0,得1。(1变0; 0变1) 比如:将 00000000 00000000 00000000 00000101 每一位取反,得 11111111 11111111 11111111 11111010 。 称: 11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。 反码是相互的,所以也可称: 11111111

计算机系统基础摘记——整数在计算机中的表示

穿精又带淫゛_ 提交于 2020-03-17 03:18:45
目录 1 数值的编码 1.1 原码 1.2 移码 1.3 补码 2 整数在计算机中的表示 参考文献 1 数值的编码 计算机是使用二进制来表示信息,因为对于电路来说,表示1和0两个状态是非常容易实现的。若要使用二进制来表示数值,则需要规定二进制对数值进行编码的规则,不同编码规则下,同一串二进制表示的数值可能不同。下面介绍几种常见的整数编码方式。 1.1 原码 原码最容易理解,对于有符号数,最高位是符号位,1表示负数,0表示正数,剩下的各个位乘其位权后相加就是对应的十进制数;对于无符号数,没有符号位。如下表: 二进制编码 有符号数 无符号数 二进制编码 有符号数 无符号数 0000 0 0 1000 8 -0 0001 1 1 1001 9 -1 0010 2 2 1010 10 -2 0011 3 3 1011 11 -3 0100 4 4 1100 12 -4 0101 5 5 1101 13 -5 0110 6 6 1110 14 -6 0111 7 7 1111 15 -7 原码虽然简单,但是计算机并没有采用原码作为其整数编码方案,因为原码有着一些局限性: 对于有符号数,0的表示不唯一; 在二进制层面做加减运算的规则复杂,比如正数的小数减大数(0001 - 0010 = 1001),正负数之间的加减运算(0001 + 1010 = 1001),负数之间的加减运算(1001 -

c++ 常量/有符号数和无符号数

穿精又带淫゛_ 提交于 2020-03-14 03:59:01
一、宏定义 #define 和常量 const 1、 const关键字 const 是 constant 的简写,只要一个变量前面用const来修饰,就意味着该变量里的数据可以被访问,不能被修改。也就是说const意味着只读(readonly)。 const修饰一个变量,一定要给这个变量初始化值,若不初始化,后面就无法初始化。 1.1 #include <iostream> using namespace std; int main() { const double pi; //圆周率的值用pi表示 pi=3.14159265; cout<<"圆周率的近似值是"<<pi<<endl; return 0; } 报错,没有初始化。只读。 1.2 #include <iostream> using namespace std; int main() { const double pi=3.141592; //圆周率的值用pi表示 cout<<"圆周率的近似值是"<<pi<<endl; return 0; } 1.3 const关键字应用 欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了; 对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const; 在一个函数声明中