本文主要是介绍计算机中数的表示与大小端法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 二进制整数的补码表示:
用最高位表示符号位,其余位表示数值。这样一来可以表示正数和负数(有符号数)。
如果符号位为0,说明是正数。真值=本身
如果符号位为1,说明是负数。真值=-(本身取反+1)
正数的补码=本身。
负数的补码=本身取反+1
如果用1个字节表示一个有符号数,则它的取值范围是[-127,128]。
如果用2个字节表示一个有符号数,则它的取值范围是[-32767,32768].
0始终表示为0000~
1个字节的有符号数,1=00000001,-1=11111111,3=00000011,-3=11111100
2个字节的有符号数,1=0x0001,-1=0xffff,3=0x0003,-3=fffC.
2. 大端法和小端法:
计算机中基本的存贮单元是字节,如果用2个字节表示1,某个字节应该放00000000,另一个字节应该方00000001.
把这些存贮单元看成字节数组,那么[0]单元应该放00000000还是00000001?
问题归结为存贮单元低字节放高位还是低位?如果低字节放高位,高字节放低位,称为大端表示法。否则称为小端表示法。
Java对其基本类型的内存表示用的正是大端表示法。TCP/IP协议采用的也是大端表示法。
不同的CPU架构所采用的大小端模式也不同。
PowerPC、IBM、Sun的处理器采用大端表示法来表示内存和CPU数据。
Intel x86,DEC的处理器采用小端表示法来表示内存和CPU数据。
ARM可工作在大端模式也可工作在小端模式。
文件的数据也有大小端之分:
Adobe PS,JPEG,Windows下的ansi编码的txt文件,是大端表示法。
GIF,BMP文件是小端表示法。
---用下面的java 程序可以检验出Java语言用大端表示法:
public static void main(String[] args){
FileOutputStream outStream = new FileOutputStream(new File("File_test1.txt"));
byte[] short_bytes = new byte[]{0x31,0x32};
outStream.write(short_bytes);
outStream.close();
FileOutputStream outStream2 = new FileOutputStream(new File("File_test2.txt"));
short c_12=0x3132;
DataOutput dout = new DataOutputStream(outStream2);
dout.writeShort(c_12);
outStream2.close();
}
先用大端表示法将字节数组0x3132(文本表示是12)写入文件File_test1.txt,再将0x3132这个类型为short的数字写入文件File_test2.txt;
用文本编辑器打开File_test1.txt和File_test2.txt,可以发现内容都显示为:12 (如果Java用小端表示法,则File_test2.txt内容应该显示21),因此可以断定Java用大端表示法。
---用下面的java 程序可以检验出CPU用的是大端表示法还是小端表示法:
public static void main(String[] args) {
if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) {
System.out.println("BIG_ENDIAN");
} else {
System.out.println("LITTLE_ENDIAN");
}
}
如果运行机器的CPU是Intel系列,则显示 BIG_ENDIAN。
这篇关于计算机中数的表示与大小端法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!