加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C语言深入探讨实战篇之变量溢出(一)

(2013-09-27 18:09:19)
标签:

it

分类: C/C 编程

对于有符合的char变量,127加上1等于多少?-128减去1又等于多少?

对于无符号的char变量,2551等于多少?0减去1等于多少?把一个有符号的-16赋给一个无符号的char变量又等于多少?把129赋给有符号的char变量又等于多少?

如果你非常清楚下面的这部分你就不要看了;如果你不清楚,恭喜你,读完下面的内容将彻底明白。

首先,要明白无符号和有符号的表示,无符号8位全部表示数,所以能表示28次方个数2560-255),而有符号的字符,第一个位表示符号位0表示正,1表示负所以只有7位表示数,所以按道理正数和负数各能表示27次方个数(128个),共能表示256个数,但是负数和正数的表示方法不同,正数:最高位为0,剩下7位是多少就是多少,如01101110 实际就是1101110=206

而负数:最高位为1,剩下取反加1,如11101110所以是-0010010=-18,这么一来

1000 0000 0000 0000这两个就不是一个意思了:前者先取出表示数的(符号位不管)低7000 0000取反后111 1111,加上11000 0000,实际上表示的是这是一个负数,负数的绝对值大小为1000 0000128,所以表示-128,所以,以0开头的可以表示0+127128个数,一1开头的表示-1-128128个数,而加法、减法的本质都是一样,就是在原来的码上加个111101110-18)加上1等于11101111-17),可见和正数的加法没有区别,明白了这些就不难解决文中开头提出的问题了。

有符合1270111 1111)加上1,码变成1000 0000这刚好是有符号时-128的码,再加1变成-127,可见有符号数的加法是0 1 2 ... 126 127 -128 -127...0

同理-128减去1等于127

无符号255的码1111 1111 加上1后变成了0000 0000溢出了进的1到了CPU寄存器,所以是0

00000 0000)减去1码变成(1111 1111)刚好是无符号255的码。

-16的码付给无符号的,码不边只是表示方法不一样而已。129同理

http://s6/mw690/a193c7a9tx6CYXUXYHjb5&690

官方店铺配套学习板:http://item.taobao.com/item.htm?spm=a230r.1.14.351.d26hm0&id=38756983451&ns=1#detail

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有