以2字节为例来说:

对于无符号的数值(原码反码及补码都一样),最大值为1111  1111  1111  1111=65535

最小值为0000  0000  0000  0000=0

对于有符号的来说较为复杂:

二进制原码最大为0111  1111  1111  1111=215-1=32767

二进制原码最小为1111  1111  1111  1111=-(215-1)=-32767
正0和负0:0000000000000000=1000000000000000=0
所以,二进制原码表示时,范围是-32767~-0和0~32767,一共65536个。

因为有两个零的存在,所以不同的数值个数一共只有216-1(65535)个,比16位二进制能够提供的216个编码少1个。

但是计算机中采用二进制补码存储数据。

正数编码不变,从0000  0000  0000  0000到0111  1111  1111  1111依旧表示0到32767

负数需要把除符号位以后的部分取反加1,即-32767的补码为1000  0000  0000  0001。
到此,再来看原码的正0和负0:0000  0000  0000  0000和1000  0000  0000  0000,补码表示中,正0的补码还是0000  0000  0000  0000,负0经过非符号位取反(1111  1111  1111  1111)加1后,同样变成了0000  0000  0000  0000,也就是正0和负0在补码系统中的编码是一样的。

但是,我们知道,16位二进制数可以表示216个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000  0000  0000  0000(负0的原码),因为任何一个原码都不可能在转成补码时变成1000  0000  0000  0000。所以,人为规定1000000000000000这个补码编码为-32768。
所以,补码系统中,范围是-32768~32767。

因此,实际上,二进制的最小数确实是1111111111111111,只是二进制补码的最小值才是1000000000000000,而补码的1111111111111111是二进制值的-1。
---------------------
作者:贝尔拉梅拉热翔
来源:CSDN
原文:https://blog.csdn.net/u010771437/article/details/47960607
版权声明:本文为博主原创文章,转载请附上博文链接!

[转]C语言的int最值问题,以及原码反码及补码的更多相关文章

  1. C语言学习笔记之原码反码补码

    原码:就是我们自己看的,以及机器输出给我们看的 补码:机器永远是以补码的形式将数据保存在计算机中 正数: 原码=反码=补码 负数: 反码:原码的符号位不变,其他位取反 ,1变0   0变1 补码:机器 ...

  2. C语言:数的保存 原码 反码 补码

    a=6                                     a=-18 a 的原码就是0000 0000 0000 0110        1000 0000 0001 0010 ...

  3. C语言 原码--反码--补码

    //原码,反码,补码 #include<stdio.h> #include<stdlib.h> //数值的表示方法——原码.反码和补码 //原码:最高位为符号位,其余各位为数值 ...

  4. C语言原码反码补码与位运算.

      目录:     一.机器数和真值     二.原码,反码和补码的基础概念     三.为什么要使用原码,反码和补码     四.原码,补码,反码再深入     五.数据溢出测试     六.位运算 ...

  5. 「C语言」原码反码补码与位运算

    尽管能查到各种文献,亲自归纳出自己的体系还是更能加深对该知识的理解.     本篇文章便是在结合百度百科有关原码.反码.补码和位运算的介绍并深度借鉴了张子秋和Liquor相关文章后整理而出.   目录 ...

  6. C语言基础(4)-原码,反码,补码及sizeof关键字

    1. 原码 +7的原码是0000 0111 -7的原码是1000 0111 +0的原码是0000 0000 -0的原码是1000 0000 2. 反码 一个数如果值为正,那么反码和原码相同. 一个数如 ...

  7. C语言基础 (4) 原码反码补码与数据类型

    1.回顾 使用gcc编译代码 gcc hello.c -o hello windows下编译代码 C语言编译步骤: 预处理(头文件展开,干掉注释) gcc -E hello.c -o hello.i ...

  8. 2_C语言中的数据类型 (三)原码、反码、补码

    1.1       原码 将最高位做为符号位(0代表正,1代表负),其余各位代表数值本身的绝对值 +7的原码是00000111 -7的原码是10000111 +0的原码是00000000 -0的原码是 ...

  9. C语言:整数保存 原码 反码 补码

    #include <stdio.h> /* 本题结果为:-4 short类型占据2字节 ;赋值后实际占据了3个字节,所以有溢出警告提示,结果只保留0xfffc 保存二进制:1111 111 ...

随机推荐

  1. Spring Security(二十九):9.4.1 ExceptionTranslationFilter

    ExceptionTranslationFilter is a Spring Security filter that has responsibility for detecting any Spr ...

  2. MySQL数据库引擎类别和更换方式

    MySQL数据库引擎类别 能用的数据库引擎取决于mysql在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEA ...

  3. Java 向MySql 插入日期和时间正确的姿势

    Mysql和Java之间时间对应关系表: date              java.sql.Date Datetime        java.sql.Timestamp Timestamp    ...

  4. openstack搭建之-基础服务配置(7)

    基础环境准备,所需服务器及说明 172.16.2.51     base.test.com 基础服务节点 172.16.2.52     ctrl.test.com 控制节点 172.16.2.53  ...

  5. OpenStack-Keystone(2)

    一. Keystone 概述 管理用户及其权限 维护OpenStack Services的Endpoint Authentication(认证)和 Authorization(授权) 1.验证用户 验 ...

  6. jmeter学习记录--03--jmeter负载与监听

    jmeter场景主要通过线程组设置完成,有些复杂场景需要与逻辑控制器配合. 一.测试计划设计与执行 场景设计 jmete线程组实际是一个线程池,根据用户设置进行线程池的初始优化,在运行时做各种异常的处 ...

  7. spring和mybatis的整合配置

    参考自: http://www.cnblogs.com/wangmingshun/p/5674633.html 链接中的文章里一共有三种整合方式,太多了怕记混了. 我这里只保留第二种. spring中 ...

  8. 如何批量修改网页 更新网站 一键保存 windows查看和排序

    批量打开需要修改的网页,一键保存:一个网站会由很多网页组成,当需要大量更新的时候,如果一个个进行打开修改,效率会很低,内容修改不多,且容易修改的时候,可以用editplus这种小编辑软件批量打开,批量 ...

  9. Linux 学习 (八) Shell

    Linux达人养成计划 I 学习笔记 Shell 是什么: Shell 是一个命令解释器 Shell 还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强 Shell 的分类: Bourne S ...

  10. DesigningFormsinAccess2010