数据类型:它定义了变量或表达式可以存储数据的种类。
java是一种强数据类型语言
一、基本数据类型1.byte
byte在好些编程语言里被用来表示一个含有8位也就是1字节的整数, 因为它有8位, 鉴于此byte类型的变量所能存储的值的范围是 -128至127(这种情况指的是有符号字节)或者0至255。
2.short
用来表示16位有符号整数的short, 在内存空间中固定占用2个字节, 也就是16位。
short s = 100;3.int
int用来表示32位有符号整数, 它固定占用4个字节, 也就是32位的内存空间。
int类型的变量如果不赋初始值,默认为0。
4.long
long被用来表示64位有符号整数,它固定占用8个字节, 也就是64位的内存空间。和int类型相比较而言 long类型通常占用更多的内存空间了, 所以它能够表示更大的整数范围。
5.float
存储单精度浮点数时会用到float类型, 一般情况下, 它会占用4个字节那样大小的内存空间, 也就是32位的内存空间呢。
float a = 3.14;6.
存储的时候会用到一种类型, 这种类型是用来存双精度浮点型的, 而且它的精度要比单精度浮点数更高一些, 一般情况下, 它会占用64位的内存空间, 也就是8字节空间才对。
double a = 3.14159;7.
类型用于表示逻辑上的真(true)或假(false)。
8.char
char类型, 是用于在计算机编程语言里表示单个字符的基本数据类型, 在java当中此类型通常占用2个字节, 也就是16位的内存空间, 它能来表示ASCII码表或者码表中的字符。
字符类别运用字符集编码, 它属于全球通用的定字长字符集体, 所使用的字符均有着16位。
public static void main(String[] args) { char c1 = '中'; char c2 = '\u4e2d'; System.out.println(c1); System.out.println(c2); }//输出结果全为 中当中, u4e2d处于字符集的范围之内, 字符“中”所对应的, 是16位二进制编码的值。
任何一个字符, 都能够被转化为一个整数, 这个整数的范围是从0到65535。
public static void main(String[] args) { int a = '中'; System.out.println(a); }可以查看某个数对应着那个字符
public static void main(String[] args) { char c = 69; System.out.println(c); //输出结果为 E转义字符
对于不方便输出的字符可以采用转义字符表示:
例如:
public static void main(String[] args) { int num = 100; String json = "{"+"\"count\":"+num+"}";// /斜杠 \反斜杠 String dataString = "[{\"id\":\"1\" ,\"name\":\"张三\"},{\"id\":\"2\" ,\"name\":\"李四\"},{\"id\":\"3\" ,\"name\":\"王五\"}]"; System.out.println(json); //输出结果为 {"count":100} }转义字符 含义
\n 表示回车
\r 表示换行符
\\ 表示反斜杠( \ )
\' 表示单引号( ' )
\" 表示双引号( " )
请你提供具体内容以便我进行改写。当前仅有“---------------------------------------------------------------------------------------------------------------------”, 无法按要求生成改写后的句子。
内存空间分布
二、计算机对整型数据的存储方式
把整数转变为二进制, 数据类型对数据于内存里怎样存储起着决定作用, 像byte类型的大小为8bit(也就是1字节), 乃是由1bit符号位以及7bit数值位共同构成的。
1、二进制表示
在计算机内部, 是用二进制, 也就是 0 和 1 来表示所有的数据, 这里面包含整型数据。每一个二进制位也就是 bit, 它代表着 2 的幂次方的值, 这个顺序是从右到左, 或者说是从低位到高位, 并且是依次增加的。
首先, 对整数进行判断, 判断其究竟是正数, 还是负数。若是正数, 那么其符号位是0。若是负数, 那么其符号位是1。
非负整数的二进制表示获取方式为除2取余法, 该方法具体是先从整数开始, 持续不断地除以2, 伴随着进行的每次此操作, 都要记录除得的余数, 这个余数要么是0, 要么是1, 一直持续到商变为0为止。接着, 把所得到的余数数列按照逆序来进行排列, 如此便生成了该整数相应的二进制表示形式。但这里尤为需要留意、上心注意的实际情形是数据当下所处的类型状况, 不同类型的数据, 其长度是不一样的, 同时最高位呈现出来的是符号位的身份形态, 要是在按照余数逆序排列情形下加入符号位之后长度并不够, 那么就要在符号位和数值之间补零, 一直补到满足其相应长度要求完毕。
拆分法: 把这个数据进行拆分, 使其成为2^n次方相加的模式, 像正数的28啦, 它能够被拆分成16加上8加上4, 也就是2^4加上2^3加上2^2, 如此这般就可以转换为1 1100。
2、原码、反码、补码
原码, 它是符号位加上真值的绝对值, 也就是用第一位来表示符号, 其余的位用来表示值。而原码的相反数相加, 其结果并非是0。
反码, 正数的反码是其自身, 负数的反码是在原码基础上, 符号位保持不变, 其余各位进行取反操作, 反码存在加零与减零的问题。
补码, 对于正数而言, 其补码就是它自身, 对于负数来讲, 其补码是在原码条件下, 符号位维持不变, 其余各位进行取反操作之后再加 1(也就是在反码基础上 +1), 计算机内部运用补码来表示以及存储数据, 这是由于补码能够有效地处理对于正负数的加法运算。
ege: 字节型变量a被赋值为10, 这是原码形式, 这是变量a的反码形式, 这则是变量a表现出来的补码形态。
字节型变量b被赋值为负十 , 关于其原码 , 至于是反码 , 另外还有补码。
由于数据类型对数据在内存里的存储大小作了规定, 所以针对a + b的补码, 即1 0000 0000, 此时得截取数据。--->1 0000 0000(补码)。
0000在补码表示下转换为原码后结果是0 , 此过程中得到的结果等于0。
3、溢出
byte a =127; byte b =1; byte c =(byte)(a+b); System.out.println(c); //c的值为-128进行加法运算的两个变量, 类型为byte, 此时, 运算结果的类型, 会自动提升成为int类型。
a的值是127, 此值在二进制里表示为0111, 1111。
b 的值是 1(在二进制中表示为 0000 0001)。
只要你执行a + b, 鉴于类型提升, 该操作事实上是于int类型的上下文里开展的。所以, 127 + 1的结果为128, 在int类型的二进制表示当中, 128是0 0 0100 0000。
但是, 当你试着把这个int类型的结果赋给byte类型的变量c时, 你得进行显式的类型转换, 也就是(byte)(a + b)。在这个转换进程中, Java会舍弃int值的最高位, 也就是所有除了最低的8位之外的各位, 只保留最低的8位。
鉴于, 128在int里的二进制呈现是0 0 0100 0000 , 当仅留住最低的8位之际 , 你所得到的为 1000 0000。在byte的情境里, 此二进制值展现出来的是 -128 , 究其原因在于 , 最高位(符号位)是1 , 意思是这属于一个负数, 而剩余部分的7位(1000 000)在二进制补码表示法子当中对应着之给128的绝对值 (不过鉴于其为负数 , 故而实际数值是 -128)。
所以,c 的值是 -128。
三、计算机对浮点数数据的存储方式
float: 属于单精度类型, 它由1bit、8bit、23bit以及32bit共同组成。
双精度, 1bit, 11bit, 52bit, 64bit, 默认。
小数转换为二进制:
对于小数部分, 采用乘2取整法, 也就是把小数部分乘以2, 接着取出结果的整数部分, 之后再用得到的新小数部分重复这样的过程, 一直持续到小数部分变成0或者达到所需要的精度停止。
1、浮点数精度丢失
public class Client { public static void main(String[] args) { System.out.println(1.2-1); //输出结果为 0.19999999999999996 不为0.2 } }原因:
二进制:0.2---->0.10011.......
计算机转换0.2为二进制时, 因超过浮点数可存储的数据长度, 导致数据丢失。
避免方法:
public class Client { public static void main(String[] args) { //System.out.println(1.2-1); BigDecimal b1 = new BigDecimal(Double.toString(1.2)); //BigDecimal 精度强相关 BigDecimal b2 = new BigDecimal(Double.toString(1)); Duble value = b1.subtract(b2).doubleValue(); //b1.subtract(b2).doubleValue() b1减去b2 并将其值转换为double类型 System.out.println(value); ////输出结果为0.2 } }四、数据类型转换
转换的方式有两种:自动类型转换和强制类型转换
1、自动类型转换(大碗装小碗)
存在整型数据, 还有实型数据, 以及字符型数据, 它们能够进行混合运算, 然而在进行运算这个行为的时候, 不同类型的这些数据必须要先转化成同一类型。
2、强制类型转换(小碗装大碗)
若程序规定必须把某一类型的数据, 从该种类型强制性地转变为另一种类型, 那么就需要通过人工进行编程来实施强制类型转换, 这种转换也被称作显式转换。
public class Client { public static void main(String[] args) { int a = 10; byte b =(byte) a; //a为int类型转换为byte类型,“大碗转小碗”,但是byte的取值范围为-128~127 10在这个范围当中不会丢失精度 System.out.println(b); } }