Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8622
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-10 12:50
个人简介

just

文章分类
文章存档

2015年(7)

我的朋友
最近访客

分类: C/C++

2015-04-16 23:05:36

我认为char型变量的最小值应该是1111 1111,也就是-127,可是书上怎么都说其最小值是-128?

    对于多数编译器而言(包括VC++),char 都视作 signed char来处理,这时 char 的取值范围得与 二进制编码技术有关,对于补码表示法。char 的取值范围是 -128 - 127, 对于符号绝对值编码法、反码记法, char 的取值范围是 -127 - 127。char 有 8 位,最高位是符号位,所以 char可以在 -127 - 127 取值是没有疑问了。
当最高位是 1,其余位都是 0 时,按照补码表示法的规则,这个数应该是 负数了,用求负数的二进制的方法反推回去:
    二进制:    1000 0000
     减一:         0111 1111
      逐位取反:   1000 0000      //和原来的二进制形式一样,对应正整数 128
 经过这一系列操作之后,二进制形式依然是 1000 0000,对应 数值 128,但这个数是负数,因为反推前 最高位是 1 的,故对应 -128。
其他的整数类型 short 、int 、long 也可以这样推导。

 

我们的机器多数是基于补码表示的

11111111   =   -1
10000000   =   -128

现在证明   10000000   表示的是   -128而不是-0
10000000   +   00000001   =   10000001   =   -127

显然   -128   +   1   =   -127
11111111   符号位为1表示负数

将数值位按位取反加一得到
0000000+1   =   0000001

所以   11111111   =   -1

阅读(623) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~