源码 补码 反码

机器数:一个数在计算机中的二进制表示形式,  叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.

 

真值:第一位是符号位,将带符号位的机器数对应的真正数值称为机器数的真值。

 

原码:原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制。

 

反码:正数的反码是其本身。负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

 

补码:  正数的补码就是其本身。负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

          计算机内的所有值计算,均换成补码进行。

          为什么使用补码:

          (1)计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法。

                 负数的补码与对应正数的补码之间的转换可以用同一种方法——求补运算完成,可以简化硬件。可将减法变为加法,省去减法器。

                 无符号数及带符号数的加法运算可以用同一电路完成。

 

          (2)使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127],

                而使用补码表示的范围为[-128, 127].

 

          (3)因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.

 

         补码的原理:使用了 “同余”的原理,即时钟往前拨(加法)和往回拨(减法),可以实现同样的计算结果。

 

 

signed 和 unsigned

 

c语言中,存在:

unsigned int /int

unsigned char /char

unsigned short /short

double (带符号的类型)

 

当一个无符号数和一个有符号数进行比较运算时,有符号数会被隐含的转换成无符号数,并假设这两个数都是非负数,然后进行比较运算。当把一个有符号数转换成无符号数时,其底层的二进制表示没有改变,仅仅是对其进行了不同的解释。

 

注意点:

(1) 当2个unsigned 的整数比较时,不能用相减判断,而是直接用 > 或 < 来判断

(2)位数小于int的提升到int,int之后都是从signed –> unsigned

(3)对于浮点数来说,浮点数(float,double)实际上都是有符号数,unsigned 和signed前缀不能加在float和double之上,当然就不存在有符号数根无符号数之间转化的问题了。

一定要记住如果需要使用有符号数时不要忘记强制转换。

 

if( x2>x1)
printf(" x2-x1>0 x1:%d x2:%d x2-x1:%d x2-x1:%u \n",x1,x2,x2-x1,x2-x1 );
else
printf("x2-x1<0 x1:%d x2:%d x2-x1:%d x2-x1:%u \n",x1,x2,x2-x1,x2-x1 ); if( (x2-x1) >0 )
printf(" x2-x1>0 x1:%d x2:%d x2-x1:%d x2-x1:%u \n",x1,x2,x2-x1,x2-x1 );
else
printf("x2-x1<0 x1:%d x2:%d x2-x1:%d x2-x1:%u \n",x1,x2,x2-x1,x2-x1 );

运行结果

x2-x1<0 x1:99 x2:88 x2-x1:-11 x2-x1:4294967285
x2-x1>0 x1:99 x2:88 x2-x1:-11 x2-x1:4294967285

 

 

int a = -1;
unsigned int b = 1; char x = -1;
unsigned char y = 1; int m = -1;
unsigned char n = -1; char t1 = -1;
unsigned int t2 = -1; printf("a>b :%d\n", a > b);
printf("x>y :%d\n",x>y );
printf("m>n :%d\n",m>n);
printf("t1>t2: %d\n",t1>t2);

运行结果

a>b :1   /* a,b转成 unsigned int */
x>y :0 /* x,y 均被转成 int */
m>n :0 /*原因在于要把n提升为int就是255当然大于-1了,unsigned char 先提升为int,送入int的低八位中,高位全部补零 . 位数少的类型往位数多的类型转换 、*/
t1>t2: 0 /* t1转成 unsigned int 为0xffffffff,t2也是 0xffffffff ,比较应该是相等 */

 

 

 

 

参考

http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

c语言下的变量类型及计算的更多相关文章

  1. Java语言支持的变量类型有哪几种

    Java语言支持的变量类型有: 类变量:独立于方法之外的变量,用 static 修饰. 实例变量:独立于方法之外的变量,不过没有 static 修饰. 局部变量:类的方法中的变量. 实例: publi ...

  2. Java入门 - 语言基础 - 06.变量类型

    原文地址:http://www.work100.net/training/java-variable-type.html 更多教程:光束云 - 免费课程 变量类型 序号 文内章节 视频 1 概述 2 ...

  3. JS(面试中的变量类型和计算问题)

    JS(变量类型和计算) 题目1.JS 中使用 typeof 能得到那些类型? 题目2.何时使用 === 何时使用==? 题目3.JS 中有哪些内置函数? 题目4.JS 变量按照存储方式区分为那些类型, ...

  4. js变量类型和计算

    # js入门基础-变量类型和计算 ` --首先由于我使用了一个不太合格的markdown来编写来文章,所以在移动端阅读不要太方便,建议移动端使用横屏模式或pc端阅读,当然如果你有平板那是最好的. -- ...

  5. Java语言支持的变量类型有

    Java语言支持的变量类型有: 类变量:独立于方法之外的变量,用 static 修饰. 实例变量:独立于方法之外的变量,不过没有 static 修饰. 局部变量:类的方法中的变量.

  6. js面试题知识点全解(一变量类型和计算)

    1.js中使用typeof能得到哪些类型 2.何时使用===和== 3.js中的内置函数 4.js变量按存储方式区分为哪些类型,并描述其特点 5.如何理解json 以下对这些问题的知识点做一些总结: ...

  7. JS变量类型与计算

    一.题目 1.JS中使用typeof能得到哪些类型? 2.何时使用===何时使用==? 3.JS中有哪些内置函数? 4.JS变量按照存储方式区分为哪些类型,并描述其特点? 5.如何理解JSON? 知识 ...

  8. JS基础知识——变量类型和计算(一)

    JS中使用typeof能得到的哪些类型? 何时使用===何时使用==? JS中有哪些内置函数? JS变量按照存储方式区分为哪些类型,描述其特点? 如何理解JSON? 知识点梳理 一.变量类型: (1) ...

  9. go语言中获取变量类型的三种方法

    package main import ( "fmt" "reflect" ) func main() { var num float64 = 3.14 // ...

随机推荐

  1. 基于 Arduino 开发板,这款插座是可编程且开源的

    基于 Arduino 开发板,这款插座是可编程且开源的 https://www.oschina.net/news/74861/open-source-socket https://github.com ...

  2. 【sam复习】用sam实现后缀排序

    没错,一定是无聊到一定境界的人才能干出这种事情. 这个无聊的zcysky已经不满足于用后缀平衡树求sa了,他想用sam试试. 我们回顾下sam的插入过程,如果我们从最后一个state沿着suffix ...

  3. 2017多校第7场 HDU 6129 Just do it 找规律

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6129 题意:求a序列后m次xor前缀和 解法: 手动对1位置对每个位置的贡献打表发现 第一次 贡献为 ...

  4. C json实战引擎 三 , 最后实现部分辅助函数

    引言 大学读的是一个很时髦的专业, 学了四年的游戏竞技. 可惜没学好. 但认真过, 比做什么都认真. 见证了  ...... 打的所有游戏人物中 分享一位最喜爱 的 “I've been alone ...

  5. python_day5学习笔记

    一.正则表达式 字符: \d 匹配任何十进制数:相当于类[0-9] \D 匹配任何非数字字符:相当于类[^0-9] \s  匹配任何空白字符:相当于类[  \t\n\r\f\v] \S  匹配任何非空 ...

  6. redis之(二十)redis的总结一

    1 什么是Redis Redis(REmote DIctionary Server,远程数据字典服务器)是开源的内存数据库,常用作缓存或者消息队列. Redis的特点: Redis存在于内存,使用硬盘 ...

  7. hdu 1547(BFS)

    Bubble Shooter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  8. BZOJ1898: [Zjoi2004]Swamp 沼泽鳄鱼

    1898: [Zjoi2004]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 478  Solved: 286[Submit][St ...

  9. C#使用NOPI生成excel要点记载

    很久没动手写博客了,最近由于公司比较忙,接触了不同类容,对自己的技术和业务理解有了更深入的理解.今天有点小空,将前段时间所运用到的一些知识点记录下来. 由于公司业务需要统计一些数据,所以对于我们来说, ...

  10. 【转】Django中的cookie与session

    转自:https://www.cnblogs.com/chenchao1990/p/5283725.html cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空 ...