博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算机系统基础学习笔记及博客
阅读量:7117 次
发布时间:2019-06-28

本文共 1319 字,大约阅读时间需要 4 分钟。

1 为何八位有符号整数的范围是-128~127,而不是-127~128

八位的带符号的整数,比如JAVA中的byte,c#中的SByte,为什么值域范围都是-128-127而不是-127~128?

事实上,远古时期有些计算机的设计是采用了反码表示有符号数的,因此8位有符号数的范围是-127~127,它的一个缺点是0是有正负。它用一位表示正负数,然对剩余的位数采用取反。

比如,0111 1111表示127,那-127的则是1000 0000。0000 0000表示正的0,而1111 1111则表示成为负0。因此反码作为有符号的整数并未流行。

现在的计算机中,通常将正数的补码来表示其负数,采用补码的好处是在硬件电路的实现上,只要使用一种加法电路就可以处理各种有符号数的加减计算,使得电路设计简单。

而补码计算方式为取反码加1,比如,对于正数0000 0001的一个补码计算,

首先取反码成为1111 1110,然后+1,变成1111 1111。所有-1的表示就是1111 1111

那么问题来了,八位整数中,如果首位表示正数,那么最多就到127,无法128,那么-128是怎么出来的?

如果我们假设1000 0000表示的是128,取反码,得到的是0111 1111,再加1有变成了1000 0000,也就是128的反码就是它本身,128和-128是一个数。由于在计算机中表示有符号数时,通常将最高有效位为0的认为是正数,最高有效位为1的认为是负数,因此1000 0000就表示为-128了。所以8位有符号整数的范围是-128~127。

事实上,还有一个更好理解的方式,-127的表示方式为1000 0001,那么-128=-127-1

即-128=1000 0001-0000 0001=1000 0000

参考自:

2 C++中数据溢出后数据本身是如何变化的?是移高位留低位,还是变成一个随机的数?

C++语言的整型溢出,分为无符号整型溢出和有符号整型溢出。
对于unsigned整型溢出,C的规范是有定义的——“溢出后的数会以2^(8*sizeof(type))作模运算”,也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模。如:
1.unsigned char x = 0xff;
2.printf("%dn", ++x);
上面的代码会输出:0 (因为0xff + 1是256,与2^8求模后就是0)
对于signed整型的溢出,C的规范定义是“undefined behavior”,也就是说,编译器爱怎么实现就怎么实现。如:
(1)signed char x =0x7f; //注:0xff就是-1了,因为最高位是1也就是负数了
(2)printf("%dn", ++x);
上面的代码会输出:-128,因为0x7f + 0×01得到0×80,也就是二进制的1000 0000,符号位为1,负数,后面为全0,就是负的最小数,即-128。
参考自:
3 关于比特和字节

转载于:https://www.cnblogs.com/dowtowne/p/10830314.html

你可能感兴趣的文章
开始使用Chronograf(官方说明)
查看>>
loading
查看>>
微信小程序:将中文语音直接转化成英文语音
查看>>
debian shell脚本关联
查看>>
静态构造函数(C# 编程指南)
查看>>
如何创建一个WebService
查看>>
NVelocity标签设置缓存的解决方案
查看>>
poj1053
查看>>
用CSS实现无图片背景圆角效果
查看>>
基于ArcGIS10.0和Oracle10g的空间数据管理平台二(C#开发)
查看>>
利用MediaElement控件制作一个简单的播放器
查看>>
SQLServer DBA 三十问之我答(第1~10题)
查看>>
异步调用之精简方式
查看>>
析构函数 Destructor
查看>>
linux时间相关结构体和函数整理【转载】
查看>>
XQuery的FLOWR表达式
查看>>
在Net中javascript获取Request的值
查看>>
Andriod平台"点九" .9.png设计介绍(转)
查看>>
JavaScript图片放大技术(放大镜)示例代码
查看>>
【转】反编译APK文件
查看>>