版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
我们用byte类型 8位表示一个数字,范围是0~127,那么负数怎么办,这时候有人提出把第一位当做符号位,那么范围从11111111 - 01111111 是-128 ~127,那么11111111明明是-127为什么书上却说是-128呢,这里需要知道反码补码的概念,计算机内存存的都是补码 先记住:
正数 原码,反码,补码是它本身
负数 反码是除了符号位都取反,补码是反码+1
从推导上看 -126原码是11111110 反码是10000001 补码是10000010,
-127原码是11111111 反码是10000000 补码是10000001,
其实就是 -128, 10000000
其实就是-0 +0和-0其实都是0,这个算法好深奥,把-0当做了-128
那么问题来了,浮点数怎么表示呢,我最近学java,举个例子,十进制的1.1用二进制怎么表示呢,0.1可以表示成1/16+32/16+.....无限接近,但是这个数字不精确,因为0.1是1/10,但是2的任何次方都不可能等于10,所以浮点数有误差
浮点数在内存是怎么表示的呢,这个小数点用0或者用1都不太对,那么就用到科学计数法,±1.1010111*2^11010101 是这样表示的
32位单精度float 第一位是标志位,最后是23个字符位,中间的是2头上的次方数,而且最后的字符位小数点前面的1可以省略,只存小数点后面的数,那么有的小伙伴就问了,为什么小数点前面不能是0呢,这里稍微反应一下就好了,必不可能是0,如果是0就需要再往后挪一位。
所以32位浮点数最大值是1.11111111111111111111111*2^127
unicode所有的都是两字节 ,大概能存65535个
utf-8中 英文一字节,一些字符两字节,中文三字节
char类型默认使用unicode编码 是两个字节