这是一个困惑了我几年的问题,它让我对现在的教科书和老师极其不满,从我N年前开始摸电脑时,就几乎在每一本C++教科书上都说,8位有符号的取值范围是-128~+127,为什么不是-127~+127呢,后来的java,int的聚值范围,再32位计算,-2^31 ~ +2^31-1,可是,却从来没有任何一本教科书或一个老师比我解释过这个问题
原因没有在工作上或者是什么地方直接遇到它,所以我也一直忽略它,但心里总是有一根刺.直到刚才!!!!
就是刚才,无聊之极,在看汇编的书时,又遇到它了,但一如以往,书上直接地,有心地,明显地绕过了这个问题,真是可恶啊
几经周折,终于把它搞清楚了:
其实,它是计算机底层为了实现数值运算而决定的,涉及非常非常基础的原码,反码,补码知识,一般(99.9999%)都不会用得上.
那0.0001%,估计也就是计算机考试了,
话说:
用2^8来表示无符号整数的话,全世界的理解都是0 - 255了,那么,有符号呢? 用最高位表示符号,0为+,1为-,那么,正常的理解就是 -127 至 +127 了.
这就是原码了,值得一提的是,原码的弱点,有2个0,即+0和-0,还有就是,进行异号相加或同号相减时,比较笨蛋,先要判断2个数的绝对值大小,然后进行加减操作,最后运算结果的符号还要与大的符号相同.
于是乎,反码产生了,原因....略,反正,没过多久,反码就成为了过滤产物,也就是,后来补码出现了.
补码的知识不说述,只说有关+127和-128的.
官方的定义 [-2^(n-1),2(n-1)-1],补码的0没有正负之分
原因呢?没有一本书上有说,这也是我这么火的原因,但通过思考,google,再思考,很快找到答案:
首先,难不免干点白痴般地事情,穷举一下...
正数,原码跟补码一样
+127, 0111 1111
+126, 0111 1110
+125, 0111 1101
+124, 0111 1100
+123, 0111 1011
+122, 0111 1010
...
+4, 0000 0100
+3, 0000 0011
+2, 0000 0010
+1, 0000 0001
0, 0000 0000 (无正负之分)
下面是负数了,值,原码,符号位不变其它取反,+1
-1, 1000 0001, 1111 1110, 1111 1111
-2, 1000 0010, 1111 1101, 1111 1110
-3, 1000 0011, 1111 1100, 1111 1101
-4, 1000 0100, 1111 1011, 1111 1100
-5, 1000 0101, 1111 1010, 1111 1011
-6, 1000 0110, 1111 1001, 1111 1010
-7, 1000 0111, 1111 1000, 1111 1001
-8, 1000 1000, 1111 0111, 1111 1000
-9, 1000 1001, 1111 0110, 1111 0111
-10, 1000 1010, 1111 0101, 1111 0110
-11, 1000 1011, 1111 0100, 1111 0101
-12, 1000 1100, 1111 0011, 1111 0100
-13, 1000 1101, 1111 0010, 1111 0011
-14, 1000 1110, 1111 0001, 1111 0010
-15, 1000 1111, 1111 0000, 1111 0001
-16, 1001 0000, 1110 1111, 1111 0000
-17, 1001 0001, 1110 1110, 1110 1111
...
-24, 1001 1000, 1110 0111, 1110 1000
...
-99, 1110 0011, 1001 1100, 1110 0100
...
-124, 1111 1100, 1000 0011, 1111 1101
-125, 1111 1101, 1000 0010, 1000 0011
-126, 1111 1110, 1000 0001, 1000 0010
-127, 1111 1111, 1000 0000, 1000 0001
看出点什么了没有?
如果没有,那么,给个提示, 再继续下去,下一个补码是什么呢?
当然是
-128, 先略过,再略过, 1000 0000
1000 0000,那么,它的原码是什么呢?
从补码求原码的方法跟原码求补码是一样的
先保留符号位其它求反: 1111 1111, 再加1:11000 0000, 超过了8位了
对,用8位数的原码在这里已经无法表示了
关键就在这里,补码 1000 0000 为 -128 是不用怀疑的(上面的穷举),
那么,回到原码处, 它的原码也是 1000 0000(超出的自动丢失),
1000 0000 在原码表示什么呢? -0, 但补码却规定0没有正负之分
转换一下思路,看看计算机里,是怎么运算的:
对于负数,先取绝对值,然后求反,加一
-128 -> 128 -> 1000 0000 -> 0111 1111 -> 1000 0000
现在明确了吧
所以, 8位有符号的整数取值范围的补码表示
1000 0000 到 0000 0000, 再到 0111 1111
即 -128 到 0, 再到 127
最终 -128 ~ +127
感谢google,感谢被我浏览过又关闭了还忘记了姓名的广大的blog们,CSDN(那上面也有些不错的东西)
over~
分享到:
相关推荐
- `Ctrl+Shift+-`:插入不连续连字符。 - `Ctrl+Shift+空格`:插入不连续空格。 - `Alt+Ctrl+C`:插入符号。 - `Alt+Ctrl+R`:插入注册商标符号。 - `Alt+Ctrl+T`:插入商标符号。 - `Alt+Ctrl+.`(句点):...
### IntelliJ IDEA 快捷键中文版详解 #### 一、概览 本文档旨在详细介绍IntelliJ IDEA快捷键中文版的使用方法与应用场景,帮助开发者更高效地利用这些快捷键来提升开发效率。 #### 二、查找与操作 1. **Find ...
《Android Studio 快捷键与使用技巧详解》 Android Studio,作为Android开发的官方集成开发环境,提供了丰富的快捷键和高效的工作流,极大地提升了开发者的工作效率。以下是一份详尽的Android Studio快捷键和使用...
- 指数位:8位(指数范围-127 ~ 128) - 尾数位:23位 - **double**:64位 - 符号位:1位 - 指数位:11位(指数范围-1023 ~ 1024) - 尾数位:52位 #### 六、浮点数的科学计数法表示 浮点数在内存中采用科学计数法...
其有符号范围为 -128~127,无符号范围为 0~255。 2. Smallint: Smallint 是 MySQL 中的第二小的整型数据类型,占用 2 字节空间。其有符号范围为 -32768~32767,无符号范围为 0~65535。 3. Mediumint: Mediumint 是...
* sbyte 型:有符号 8 位整数,取值范围在 -128~127 之间。 * byte 型:无符号 8 位整数,取值范围在 0~255 之间。 * short 型:有符号 16 位整数,取值范围在 -32,768~32,767 之间。 * ushort 型:无符号 16 位整数...
以下是一些在Windows系统中常用的PyCharm快捷键及其功能详解: 1. **查看文档和错误信息**: - `Ctrl + Q`:快速查看当前光标所在函数或变量的文档。 - `Ctrl + F1`:显示当前光标所在位置的错误描述或警告信息。...
例如,一个字节的无符号整数可以表示0到255的数值,而有符号整数可以表示-128到127的范围。 - 有符号数虽然最大值较小,但它能表示负数,因此在负值方向的表示范围更大。 4. **二进制表示**: - 在二进制表示中,...
《Visual Studio 2010 快捷键详解与高效编程提升》 在软件开发过程中,熟练掌握IDE的快捷键能够极大地提升编程效率,对于Visual Studio 2010(简称VS2010)这样的专业开发环境而言,这一点尤为重要。本文将详细解析...
- `Ctrl+-`:显示用于删除选定单元格的“删除”对话框。 - `Ctrl+*`:选择环绕活动单元格的当前区域(由空白行和空白列围起的数据区域)。在数据透视表中,它将选择整个数据透视表。 - `Ctrl+:`:输入当前时间。 ...
#### 快捷键详解 1. **导航与浏览** - `Ctrl+Shift+L`:显示当前文件中的所有成员列表,便于快速定位。 - `Ctrl+K`:将当前选中的文本向前移动一个单词的位置。 - `Ctrl+Shift+K`:将当前选中的文本向后移动一个...
### NetBeans快捷键详解 NetBeans是一款非常强大的开源集成开发环境(IDE),广泛应用于Java、PHP、C/C++等语言的开发。为了提高编程效率,掌握NetBeans中的快捷键是必不可少的技能之一。本文将根据提供的部分内容...
### iPhone Xcode 快捷键汇总与使用技巧详解 Xcode 是苹果官方为开发者提供的集成开发环境(Integrated Development Environment, IDE),主要用于iOS、iPadOS、macOS、watchOS 和 tvOS 的应用程序开发。掌握Xcode ...
### 数据类型的取值范围详解 在编程中,正确选择数据类型对于确保程序的高效性和准确性至关重要。本篇文章将深入探讨不同数据类型的取值范围,并提供一份详细的速查表及注意事项,帮助开发者更好地理解和运用这些...
### BH6472GUL驱动芯片详解 #### 一、概述 BH6472GUL是一款由罗姆(ROHM)公司生产的线性电流沉驱动器芯片,主要用于电子相机模块中的马达驱动,例如在CCM(Charge Coupled Module)手机摄像头模组中实现自动对焦...
10. **[×]** 8位二进制数补码的大小范围是-128~+127,而非-127~+127。这是因为在补码表示中,-128有一个唯一的表示方法。 11. **[√]** 0的补码确实是0。 12. **[√]** -128的补码确实是10000000。 13. **[√]**...
- **+Yx**:设置优化级别(x 的取值范围为 0 至 9)。 - **+ES**:标准错误文件格式。 - **+T**:创建调用树 (.TRE) 文件。 - **+EO**:旧的错误文件格式。 - **+A**:创建统计文件 (.STA)。 - **-J**:不创建 PJT ...
### Unicode编码范围详解 Unicode是一种国际化的字符编码标准,它为世界上几乎所有语言的文字提供了一种统一的编码方式。本文将详细介绍Unicode编码中的各种文字及其编码范围。 #### 基本拉丁字母与控制字符 (U+...