当前位置:编程学习 > JAVA >>

关于byte的困惑!!


     java定义byte是一个基本类型,只能存储整数,而文件中的是形形色色的字母,数字,符

号,还有汉字,视乎byte不能表示文件中这些形形色色的符号。为什么文件里都用byte类型来处

理?很迷惑!


哪个大牛能给指点一下,希望详细一点! --------------------编程问答-------------------- byte和byte之间可以组合,组成双字节 甚至四字节 那就够表示了 --------------------编程问答-------------------- byte是基本单元,多个byte就可以组合成复杂的东西了 --------------------编程问答-------------------- 计算机存储可以单纯的看作二进制数据,二进制可以表示成十进制,十六进制,本质不变。jpg文件也可以用记事本打开。区别在于打开方式,读取解析方式不同。
楼主安装个ultraedit,可以打开文件看十六进制。 --------------------编程问答-------------------- byte是个整型啊,只能存整数啊,文件里都形形色色的东西,能说的清楚一点吗?还是不太明白。 --------------------编程问答--------------------
引用 4 楼 u010841661 的回复:
byte是个整型啊,只能存整数啊,文件里都形形色色的东西,能说的清楚一点吗?还是不太明白。


你首先要理解计算机所有的数据单位,归根结底都是二进制位bit,任何其他数据类型都是bit组合起来的。一个byte包含了8个bit,而其他数据类型都包含了若干个byte,比如整型int包含4个byte,长整型long包含了8个byte。

文件中虽然内容各种各样,但是对于计算机来说,他们都长一个样,那就是二进制数据。计算机只能理解二进制数据,所有的文本 图片 音乐 视频都必须转为二进制数据才能被计算机处理。 --------------------编程问答--------------------
引用 4 楼 u010841661 的回复:
byte是个整型啊,只能存整数啊,文件里都形形色色的东西,能说的清楚一点吗?还是不太明白。


你所谓的“形形色色的东西”在计算机里根本不存在。
那是程序把一个个0101翻译成对应的显示形状,一个像素一个像素给你打在显示屏上,才有了你所谓的“形形色色的东西”在计算机里根本不存在。 --------------------编程问答-------------------- --------------------编程问答--------------------
1 在计算机内部,数据都是以二进制形式存在的,就是0101 ……。因为机器的储
存单元只有两种物理状态。一个二进制数占据的储存空间叫做一个位(Bit)。

2 早期的储存单元是8位的,叫做一个字节,就是一个byte。它可以储存全部
ASCII码。其中字母和常用符号有7位就够了,那就是128个,一字节有256个不同
状态。但显示汉字或其他某国家的语言,就大大不够了。

3 随着集成电路技术的发展,机器发展为16位, 32位和64位的。16位机器的一个
单元叫一个“字长”,正好储存一个字符(包括汉字,那就是Unicode字符集)。
现在,英文字母也用16位表示,其中高8位都设置为0,这就是JAVAz 3的char。

4 一个整数int 是32位的。一个long是16位的,一个short 和char一样长。单精
度和双精度数分别等于整数和长整数。

5 假如我们在内存中取一个8 byte的储存区,全部存入ascii码。按字节读取并显
示, 就会显示8个字母或符号。如果按字符模式读取,可以显示4个汉字或乱码,
或ASCII字符(当高8位为0时)。如果按整数模式读取,可以显示2个整数, 这时
一次读取4B。如果按长整数模式读取,可以显示1个长整数。

byteBufferd 是基本的储存区,它提供了int ,char等其他数据类型的读写方法。
读出来的数据都是经过软件处理的,变成屏幕上可显示的形式。 --------------------编程问答-------------------- 都讲得挺好的, 受用! 大家可以互相补充, 最后在整理成一个比较完成的版本, 供大家参考! --------------------编程问答-------------------- 都是二进制数 有什么不能表示的... --------------------编程问答-------------------- 所以就有了 ASCII 编码、GBK 编码、Unicode 编码了。

这些编码都是将字符规范成为计算机内部可以表示的“数字”,一个字符在一个编码体系内只能由一个数字表示。

当计算机内部认为这些数字是某个编码的时候,操作系统就会通过在该编码下数字与字符的对象应关系找出这个数字所表示的字符是什么,这个就是所谓的“字库”。

而字库中存放的也是数字,因为屏幕是由一个一个地小点所组成的,如果规定每个字符长和宽都霸占 16 个点的话,那一个字符就需要占用 256 个点,将字符的图像数据进行栅格化处理成 16*16 点的话,每行 16 个点,可以使用 2 个字节来表示,点是黑的使用“1”表示,点是空白的使用“0”表示,这样的话,16*16 的字符可以使用 32 个字节,也就是 32 个 byte 来表示了。

#######  ######    #######           ######      ######     #####    #####          ######
  ###      ##        ###               ####      ####         ####     #          ###    ###
  ###     #          ###               #####    #####         ####     #         ###      ###
  ###   ##           ###               # ###    # ###         # ###    #         ##        ##
  ###  #             ###               # ###    # ###         #  ###   #        ###        ###
  ### #              ###               #  ###  #  ###         #  ####  #        ###        ###
  ######             ###               #  ###  #  ###         #   #### #        ###        ###
  ### ###            ###               #  #### #  ###         #    ### #        ###        ###
  ###  ###           ###       #       #   ####   ###         #     ####        ###        ###
  ###   ###          ###      ##       #   ####   ###         #      ###         ##        ##
  ###    ###         ###      ##       #    ###   ###         #       ##         ###      ###
  ###     ###        ###     ##        #    ##    ###         #       ##          ###    ###
####### #######    ############      #####   #  #######     #####      #            ######
--------------------编程问答-------------------- 其实我的意思是,byte是个基本数据类型,表示一个1个字节8位,还是内存的一个byte8位,当然,内存的一个byte可以表示任何东西。大家能想想我的困惑处啊。

1个byte数据类型和内存里的1个byte还是有差别的吧,想听听他们的差别。这是重点啊。 --------------------编程问答--------------------
引用 11 楼 bao110908 的回复:
所以就有了 ASCII 编码、GBK 编码、Unicode 编码了。

这些编码都是将字符规范成为计算机内部可以表示的“数字”,一个字符在一个编码体系内只能由一个数字表示。

当计算机内部认为这些数字是某个编码的时候,操作系统就会通过在该编码下数字与字符的对象应关系找出这个数字所表示的字符是什么,这个就是所谓的“字库”。

而字库中存放的也是数字,因为屏幕是由一个一个地小点所组成的,如果规定每个字符长和宽都霸占 16 个点的话,那一个字符就需要占用 256 个点,将字符的图像数据进行栅格化处理成 16*16 点的话,每行 16 个点,可以使用 2 个字节来表示,点是黑的使用“1”表示,点是空白的使用“0”表示,这样的话,16*16 的字符可以使用 32 个字节,也就是 32 个 byte 来表示了。

#######  ######    #######           ######      ######     #####    #####          ######
  ###      ##        ###               ####      ####         ####     #          ###    ###
  ###     #          ###               #####    #####         ####     #         ###      ###
  ###   ##           ###               # ###    # ###         # ###    #         ##        ##
  ###  #             ###               # ###    # ###         #  ###   #        ###        ###
  ### #              ###               #  ###  #  ###         #  ####  #        ###        ###
  ######             ###               #  ###  #  ###         #   #### #        ###        ###
  ### ###            ###               #  #### #  ###         #    ### #        ###        ###
  ###  ###           ###       #       #   ####   ###         #     ####        ###        ###
  ###   ###          ###      ##       #   ####   ###         #      ###         ##        ##
  ###    ###         ###      ##       #    ###   ###         #       ##         ###      ###
  ###     ###        ###     ##        #    ##    ###         #       ##          ###    ###
####### #######    ############      #####   #  #######     #####      #            ######
  你又回来了? --------------------编程问答-------------------- 0和1都能表示,只要他们能组合 --------------------编程问答-------------------- 所有东西在计算机中存储时,最终都是0100101010...这样的二进制数据。
byte是8个bit,比如其中的01001010是一个byte。

比如Java中的char类型,由UTF-16表示,就是16bit的,相当于是2个byte。
汉字也一样,以Unicode存储,不管是BMP字符还是增补字符。
最多都是16bit或者32bit存储到计算机中,也就相当于是2个byte或者4个byte。

楼主如果学过计算机原理或者单片机,或者更底层的c、c++、汇编语言的话,
这个事情就好理解了。 --------------------编程问答--------------------
引用 12 楼 u010841661 的回复:
其实我的意思是,byte是个基本数据类型,表示一个1个字节8位,还是内存的一个byte8位,当然,内存的一个byte可以表示任何东西。大家能想想我的困惑处啊。

1个byte数据类型和内存里的1个byte还是有差别的吧,想听听他们的差别。这是重点啊。


没差别,byte数据类型就是用来指代8位2进制数据的,他在JVM里也会被分配8位内存。 --------------------编程问答-------------------- 非常感谢大家的回复,明天该结贴了。虽然不是很明白,自己还得多想想。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,