`

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在0x80000000~0xFFFFFFFF范围中,当然合法了,且原码的十进制表示为-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范围是-128~127,如果要表示0~255怎么办?
比如一个字符±,ascii编码是177(10110001),unicode编码是两个字节0,177(00000000,10110001),UTF-8编码(参考unicode到utf-8转换规则)是两个字节194,177(11000010,10110001)
byte[] buff="±".getBytes("iso-8859-1");
System.out.println((char)177);//a
System.out.println((char)buff[0]);//b
System.out.println(buff[0]);//c

FileOutputStream 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);//d
System.out.println(x);//e
System.out.println((byte)x);//f

1.a输出是±,b是?,c是-79;
根据ascii编码字符"±",编码后二进制表示则是10110001,一个字节长度8位,只用一个字节就能表示,如果使用其他使用无符号byte来存放值的语言,那buff[0]就等于177,但java的byte是带符号的,且二进制是用补码表示的,根据177的二进制数10110001,转换成原码就是-79,所以c处为-79.
2那如何让buff[0]能转换成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()方法的源码
    public synchronized int read() throws IOException {
	if (pos >= count) {
	    fill();
	    if (pos >= count)
		return -1;
	}
	return getBufIfOpen()[pos++] & 0xff;//a
    }

a处用了整数逐位运算&,将buf[pos](byte)和0xff(int)进行"与"运算,java语言规范规定,如果一个整数运算,至少有一个long操作数,那么将使用64位的精度执行运算,且结果是long类型,如果另外的操作数不是long,则将其数值加宽到long,否则将执行32位的精度运算,如果不是int则加宽到int,结果为int。所以这里byte会加宽到32位,然后与32位的0xff与运算,获得前24位全为0,低8位为真实数值的int类型整数,这样就将byte通过int类型表示成了0~255。

0
0
分享到:
评论

相关推荐

    原码反码补码讲课.pptx

    在对计算机中的整数进行探讨时,我们不得不提及带符号整数的三种不同编码方式:原码、反码以及补码。这些编码方式在计算机内部用于表示正数和负数,并决定了计算机如何处理整数的加减运算。 首先,我们来定义带符号...

    计算机基础知识:原码反码补码练习(含答案)

    计算机基础知识在IT领域至关重要,尤其是对于理解计算机内部...了解这些基础知识对于进行计算机编程、内存管理、硬件设计等IT工作都非常重要,特别是在处理数值运算时,理解和应用原码、反码和补码的概念是至关重要的。

    原码反码补码PPT学习教案.pptx

    原码反码补码是计算机系统中最基本的概念之一,了解原码反码补码的原理和应用对于计算机科学和技术的学习非常重要。本资源摘要信息将对原码反码补码的概念、特点和应用进行详细的介绍。 一、机器数与真值 机器数是...

    二进制转原码反码补码 C语言源码

    /* *功能实现任意二进制数的原码 反码 补码转换 *仅仅是字符串的操作,没有进行数字操作 *对-0的操作可能有问题 *ssfshine@gmail.com */

    原码反码补码图解.

    原码反码补码图解.原码反码补码图解.原码反码补码图解.

    原码、反码、补码三码转换(C#)

    在计算机科学中,原码、反码和补码是用于表示二进制数值,特别是负数的三种方式。本文将详细讲解这三种编码方式,并通过C#编程语言演示如何进行三码之间的转换。 1. 原码(Direct Code): 原码是最直观的二进制...

    二进制原码反码补码.docx

    二进制原码反码补码知识点总结 ...二进制原码反码补码是计算机中表示数值的三种方式,它们之间的转换是非常重要的。计算机的数制转换是一个非常重要的知识点,包括二进制、八进制、十六进制、十进制之间的换算。

    补码源码反码转换工具,补码反码原码的转换工具,C/C++

    在计算机科学中,二进制表示的数字有三种主要形式:原码、反码和补码,主要用于表示有符号整数。本项目是基于C++的MFC(Microsoft Foundation Classes)框架实现的一个实用工具,旨在帮助用户理解并进行原码、反码和...

    原码反码补码说课.pptx

    本资源是关于计算机组成原理的教学课件,主要讲解了原码、反码和补码的概念、计算方法和表示范围。该课件旨在培养学生实事求是的学风、耐心细致的工作作风和严谨的工作态度。 一、知识目标 * 了解原码、反码和补码...

    原码,反码,补码详解及原理.docx

    原码、反码和补码是计算机中用来表示有符号整数的重要概念,它们主要用于二进制数的存储和计算,特别是在计算机硬件中简化运算过程。以下是对这些概念的详细解释: 1. **原码**: 原码是最直观的表示方式,直接在...

    二进制-原码-补码-反码.pdf

    "二进制-原码-补码-反码" ...原码、反码和补码都是计算机科学中重要的概念,它们都是有符号数的表示方法。补码是最常用的表示方法,因为它可以统一正零和负零的表示,并可以让计算机执行减法运算。

    计算机中的原码、反码和补码

    在深入探讨计算机中表示有符号整数的原码、反码和补码之前,让我们先回顾一下计算机存储数据的基本单位——字节。正如文中所述,一个字节由8位组成,每位可以是0或1,因此一个字节可以表示\(2^8 = 256\)种不同的状态...

    数字的原码、反码和补码

    数字的原码、反码和补码 在计算机中,数字的表示形式为机器数,计算机只能识别 0 和 1,使用的是二进制,而在日常生活中人们使用的是十进制。为了能方便地与二进制转换,就使用了十六进制(2^4)和八进制(2^3)。...

    机器数, 真值, 原码, 反码, 补码 详解

    在计算机科学中,数据的表示方式至关重要,尤其是在处理数值计算时。本文主要探讨了机器数、真值以及原码、反码和补码这三种在计算机中表示有符号整数的关键概念。 首先,机器数是计算机中用于表示数值的二进制形式...

    原码 补码 反码 按位运算

    原码、补码和反码是三种常见的二进制表示法,主要用于表示有符号整数,而按位运算则是对二进制数进行操作的基础手段。下面将详细阐述这些概念。 一、原码(正码) 原码是最直观的二进制表示方法,直接反映了数字的...

    JAVA基础补充(0)-原码反码补码.doc

    例如,Java中byte类型的范围是-128到127。如果有一个byte变量x等于127,然后将其加1,由于溢出,x会变为-128。在8位系统中,-128的补码表示为10000000,而其原码表示为11111111取反后加1,即10000000。 在进行位...

    进制转换及原码反码补码.docx

    进制转换及原码反码补码 在计算机系统中,数字系统是基础部分,很多计算机科学家和程序员需要熟悉不同的数字系统和它们之间的转换。下面我们将详细介绍进制转换、原码、反码和补码的概念和应用。 一、进制数的表达...

    学习电脑信息原码反码补码详细解析

    "学习电脑信息原码反码补码详细解析" 本文详细介绍了原码、反码和补码的概念、计算方法和应用场景。在学习原码、反码和补码之前,需要了解机器数和真值的概念。机器数是指一个数在计算机中的二进制表示形式,带符号...

    16进制(4位)到二进制原码、反码、补码计算

    16进制(4位)到二进制原码、反码、补码计算

    电脑计算8位原码反码补码表

    在8位二进制的补码表示中,存在一个特殊情况,即-128(1000 0000),这个值没有对应的原码和反码表示,因为-128的补码就是其本身,且在原码中,如果最高位是0,则无法表示-128。这种设计是为了避免在处理负数时出现...

Global site tag (gtag.js) - Google Analytics