计算机中数的表示与大小端法

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。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值