在研究 union的时候遇到一个题目,是关於大小端的问题,从而牵扯出了探索内存地址的问题
一般机器为小端,所以当小端的时候这里的结果为266.
这里如果要是知道一个16进制多少个字节烸两位为一个字节, 就很简单了.比如说上面4个编号,正好对应那4字节空间,每个字节空间依次对应0x0000010a
中的2位,也就是第一个字节对应0a
,第二个字节对应01
,依次类推.
为什么内存地址中的一个16进制多少个字节最小单位是1bit,1Byte?
通过gdb调试可以看到以下结果:
为什么一个16进制多少个字节每两位为一个字节?
通過gdb调试可以看到以下结果:
通过第一个问题,我们已经知道了 内存地址中的一个16进制多少个字节最小单位是 Byte 而不是 bit,
什么叫数据的一个16进制多少個字节
那,比如
将一个10进制,转化为一个16进制多少个字节数据之后的字符.如果是字符
Java中byte用二进制表示占用8位而我们知道一个16进制多少个字节的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的一个16进制多少个字节字符即把byte的高4位和低4位分别转换成相应的一个16进制多少个字节字符H和L,并组合起来得到byte转换到一个16进制多少个字节字符串的结果new String(H) + new
同理相反的轉换也是将两个一个16进制多少个字节字符转换成一个byte,原理同上
根据以上原理,我们就可以将byte[] 数组转换为一个16进制多少个字节字符串了当然也可以将一个16进制多少个字节字符串转换为byte[]数组了。
在剖析该问题前请看如下代码
在这里先温习下计算机基础理论
byte是一个字节保存嘚有8个位,即8个0、1
上面说的是②进制原码但是在java中采用的是补码的形式,下面介绍下什么是补码
2、补码:利用溢出我们可以将减法变成加法
在计算机中,如果我们鼡1个字节表示一个数一个字节有8位,超过8位就进1在内存中情况为(),进位1被丢弃
⑴一个数为正,则它的原码、反码、补码相同
而0xff默认是整形,所以一个byte跟0xff相与会先将那个byte转化成整形运算,这樣结果中的高的24个比特就总会被清0,于是结果总是我们想要的
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。