




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java中的数值数据、原码、反码、补码、数据类型及范围、字面量 java基础java补码范围字面量数据类型一、数据在计算机中的表示 数据分为两种,一种是数值型数据,另一种是非数值型数据。这里只讨论数值型数据。 首先声明: 1、无论是二进制、八进制、十六进制还是十进制,大家都是一样的,十进制有的,其他进制也有。例如它们都有正负数之分,都有整数小数部分。 2、特别小心二进制数,所有的数据在计算机中都是用0和1的组合表示的,也可以说是二进制,但不是二进制数。一个二进制数在计算机中的表示是以这个二进制数的补码形式表示的,由于二进制数可能是正数、负数、小数,所以它的补码可能会跟这个二进制数不相同。这样说,可能听起来有点意思,一个二进制数用二进制表示。 数值在计算机中的表示需要考虑的三个问题 1、存储长度:计算机存储数据是以字节为单位的,一个字节有8位。程序语言中int型有2个字节的,也有4个字节的。还有char 2、符号:数据有正负之分,约定“0”表示正,“1”表示负。 3、数据的表示。如果数据以有无小数的方式来分,则分为整数,纯小数,大于1的小数。表示方法可分为定点和浮点表示法。定点表示方法又可分为定点整数和定点小数。如果一个数是整数就用定点整数表示,如果是一个小于1的小数就用定点小数表示,如果是个大于1的小数,就是说既有整数部分,又有小数部分就用浮点表示。也就是说定点整数法表示整数,定点小数法表示纯小数,浮点法表示大于1的小数(小数定义:有小数点的数)。这样说来程序设计语言中float型的数据在计算机中的表示可能是用定点小数法,也可能用浮点法了,事实真的是这样吗?我不知道。浮点表示法也可以表示纯小数,那么还要定点小数法干嘛呢?因为定点小数法简单,便于运算。 4、浮点表示法:源自于科学表示形式,将一个数存储时分为两部分,指数部分和一个小于1 的小数部分。如果一个浮点数用4个字节表示,则指数部分占用一个字节,小数部分占用3个字节,小数部分最高位表示正负号。而且指数部分在高位。 5、原码、反码和补码。计算机是以补码的形式表示数值型数据的。正数的原码、反码、补码都是一样的。其实反码、补码的提出就是针对负数的,跟正数屁关系没有。也许只是为了统一一下说法“计算机都是以补码的形式表示数据的”,不然就得说正数是用原码表示,负数时用补码表示。 6、补码。负数在计算机中的表示步骤:原码反码(符号位不变)补码(加1)。由补码计算出负数真值的方法有两种。一是,补码减1取反(符号位不变)原码;二是,补码取反后加1原码。所有的取反都不涉及符号位。 记住计算机中一个二进制数是以其补码形式表示的,下面会有介绍。 二、计算机中的数制 1.几种数制 a. 十进制数:编程时使用,默认数字就是十进制 b. 二进制数:计算机内部信息存储,运算, 输出都是二进制数,源代码无法写出。 c. 八进制数:源代码中用0XX表示,如013,07723,0271。 d. 十六进制数:源代码中用0xXX表示,如0x13f,0xf2ea,0xac,字母不分大小写. 2.数值转换 几种进制数之间的转换方法: 三、有符号数 计算机只能识别0和1组成的数或代码,所以有符号数的符号也只能用0和1来表示。 真值、机器数和字长的概念 真值:一个数的数值. 用+表示正数,用-表示负数 表示正数, 如:+101 -101 机器数:计算机中用来表示有符号数的二进制数 首位为符号位,为0表示+,为1表示-,如0XXXXXXX 1XXXXXXX 字长:包括符号位在内,一个二进制数占有的位数。 字长n=8的二进制,符号位占1位,数值部分占7位。 由于数值部分的表示方法不同, 有符号数可有三种表示方法 , 即机器数有三种形式 , 分别叫 做原码,反码和补码. 四、原码、反码、补码详细介绍 原码:原码表示的有符号数,最高位为符号位,数值 位部分就是该数的绝对值. 如一个字节: 十进制54 二进制源码:0011 0110 十进制-54 二进制源码:1011 0110 反码:反码表示的有符号数,也是把最高位规定为符号 但数值部分对于正数是其绝对值, 而对于负 数则是其绝对值按位取反( 数则是其绝对值按位取反(即1变0,0变1). 如一个字节: 十进制54 二进制源码:0011 0110 反码:不变 十进制-54 二进制源码:1011 0110 反码:1100 1001 补码:补码表示的有符号数,对于正数来说同原码,反码一样,但负数的数值位部分为其绝对值按位取反后末位加1所得 如一个字节: 十进制54 二进制源码:0011 0110 反码:不变 补码:不变 十进制-54 二进制源码:1011 0110 反码:1100 1001 补码: 1100 1010 注:1.负0补码和正0补码相同。 2.补码的数值范围 假设二进制数字长为n,表示整数,则补码范围(括号内为指数) -2(n-1) 2(n-1) -1 8位补码 1000 0000 0111 1111 -128 +127 16位补码 1000 0000 0000 0000 0111 1111 1111 1111 -32768 +32767 3.负数的原码的补码即等于补码,补码的补码又等于原码。 五、JAVA中的数据类型、是否有符号及范围 boolean char 无符号 0 65535; byte 带符号 -128 +127 short 带符号 -32768 +32767 int 带符号 -2147483648 +2147483647 long 带符号 . float 带符号 . double 带符号 . 注意:以上范围是指十进制,明白这点很重要。要想既然范围可以用十进制表示,那么同样可以用其他进制表示,因为下面要用到,所以这里写出int的十六进制数表示的范围(结合上面说所原码反码补码来思考): -2147483648 -0 0x80000000 0xFFFFFFFF +0 2147483647 0x00000000 0x7FFFFFFF 在Java中整数存在两种类型的字面量(字面值literal):整数型与长整型。如10是整数型字面量(int类型);10L是长整型字面量(long类型); 1.当字面量没有超出指定变量的数据类型的范围的时候,赋值是合法的,可以编译通过。 (合法赋值) 2.当字面量本身没有超出字面量类型的范围的时候,字面量是合法的,可以编译通过。 (合法字面量) a为变量,=号后面为字面量,看一下源代码是否合法,注意不同进制所表示的字面量. byte a=1; 合法 byte a=128; 超出范围:128超出了(变量a的数据类型)byte的范围。(不合法赋值) int a=0xFFFFFFFF; 合法:0xFFFFFFFF在0x800000000xFFFFFFFF范围中,当然合法了,且原码的十进制表示为-1。 int a=2147483648; 超出范围:2147483648超出了(字面量类型)int的范围 (不合法字面量) int a=(int)0xFFFFFFFFl; 合法:这里是long,自己算出long的十六进制范围,然后.不用多说了吧 long a=2147483648; 超出范围:2147483648超出了(字面量类型)int的范围 long a=2147483648l; 合法:2147483648是long,没超出long范围 int a=(int)2147483648l; 合法:这里是long,十进制数2147483648没超出long十进制表示的范围 注意:0xFFFFFFFF在Java中被认为是int,是因为后面同样没有跟l或L来表示long。 java中,byte范围是-128127,如果要表示0255怎么办? 比如一个字符,ascii编码是177(10110001),unicode编码是两个字节0,177(00000000,10110001),UTF-8编码(参考unicode到utf-8转换规则)是两个字节194,177(11000010,10110001) Java代码 1. bytebuff=.getBytes(iso-8859-1); 2. System.out.println(char)177);/a 3. System.out.println(char)buff0);/b 4. System.out.println(buff0);/c 5. 6. FileOutputStreamout=newFileOutputStream(a.txt); 7. out.write(buff); 8. out.close(); 9. FileInputStreamin=newFileInputStream(a.txt); 10. BufferedInputStreambis=newBufferedInputStream(in); 11. intx=bis.read(); 12. bis.close(); 13. System.out.println(char)x);/d 14. System.out.println(x);/e 15. System.out.println(byte)x);/fbyte buff=.getBytes(iso-8859-1);System.out.println(char)177);/aSystem.out.println(char)buff0);/bSystem.out.println(buff0);/cFileOutputStream out=new FileOutputStream(a.txt);out.write(buff);out.close();FileInputStream in=new FileInputStream(a.txt);BufferedInputStream bis=new BufferedInputStream(in);int x=bis.read();bis.close();System.out.println(char)x);/dSystem.out.println(x);/eSystem.out.println(byte)x);/f1.a输出是,b是?,c是-79; 根据ascii编码字符,编码后二进制表示则是10110001,一个字节长度8位,只用一个字节就能表示,如果使用其他使用无符号byte来存放值的语言,那buff0就等于177,但java的byte是带符号的,且二进制是用补码表示的,根据177的二进制数10110001,转换成原码就是-79,所以c处为-79. 2那如何让buff0能转换成ascii编码的二进制的真值,没有符号位?(ascii,unicode,utf-8等等二进制编码都没有符号位这一说,换成十进制都是相应正整数的值) d输出是,e是177,f是-79 in.read()方法api说明:Reads a byte of data from this input stream,从输入流中读取一个字节的数据,这里说的是读取一个字节的数据,而不是读取成一个byte,所以返回的是int(4个字节). 查看BufferedInputStream的read()方法的源码 Java代码 1. publicsynchronizedintread()throwsIOException 2. if(pos=count) 3. fill(); 4. if(pos=count) 5. return-1; 6. 7. returngetBufIfOpen()pos+&0xff;/a 8. public synchronized int read() throws IOException if (pos = count) fill(); if (pos = count)return -1;return getBufIfOpen()pos
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 修改车辆管理制度
- 公共卫生员管理制度
- 公司呆死账管理制度
- 动物园公司管理制度
- 厂区污水站管理制度
- 大学文体部管理制度
- 实训室资金管理制度
- AI技术在核医学领域学生自主学习中的应用研究
- 市财政机关管理制度
- 招投标公司管理制度
- 电力行业招投标培训
- 2024年云南省中考物理试题含答案
- 2024年石家庄市市属国企业面向社会公开招聘403名管理人员及专业技术人员高频难、易错点500题模拟试题附带答案详解
- 医药代表聘用合同模板
- 2024-2030年中国公路工程行业市场发展分析及前景预判与投资研究报告
- 工伤预防宣传和培训 投标方案(技术方案)
- 古代小说戏曲专题-形考任务4-国开-参考资料
- 2.4圆周角(第1课时)(课件)九年级数学上册(苏科版)
- 杆塔组立施工安全检查表
- 基于项目化学习的数学跨学科作业设计
- 小学综合实践活动二年级下册第二单元《方格编》课件
评论
0/150
提交评论