-1 在内存中用4个分配12字节内存失败存储为什么是FC FF FF FF

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
life is too short to sit around and be sad ,go out and have a fun and see
what the world gets to offer
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(3545)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_082',
blogTitle:'BIFF8格式文档',
blogAbstract:'&&
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}trackbacks-0
在剖析该问题前请看如下代码
public static String bytes2HexString(byte[] b) {
&&String ret = "";
&&for (int i = 0; i & b. i++) {
& &String hex = Integer.toHexString(b[ i ] & 0xFF);
& &if (hex.length() == 1) {
& & hex = '0' +
& &ret += hex.toUpperCase();
上面是将byte[]转化十六进制的字符串,注意这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b[ i ] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?答案是不行的.
其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式
==================以下文字貌似有问题===================
在这里先温习下计算机基础理论
byte是一个字节保存的,有8个位,即8个0、1。
8位的第一个位是符号位,
也就是说代表的是数字1
代表的就是-1
所以正数最大位,也就是数字127
负数最大为,也就是数字-128
上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码
& && &&&一个数如果是正,则它的反码与原码相同;
& && &&&一个数如果是负,则符号位为1,其余各位是对原码取反;
2、补码:利用溢出,我们可以将减法变成加法
& && & 对于十进制数,从9得到5可用减法:
& && & 9-4=5& & 因为4+6=10,我们可以将6作为4的补数
& && & 改写为加法:
& && & 9+6=15(去掉高位1,也就是减10)得到5.
& && & 对于十六进制数,从c到5可用减法:
& && & c-7=5& & 因为7+9=16 将9作为7的补数
& && & 改写为加法:
& && & c+9=15(去掉高位1,也就是减16)得到5.
& & 在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(),进位1被丢弃。
& & ⑴一个数为正,则它的原码、反码、补码相同
& & ⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1
- 1的原码为& && && && && &
- 1的反码为& && && && && &
& && && && && && && && && && && && && && && && && &+ 1
- 1的补码为& && && && && &
0的原码为& && && && && &&&
0的反码为& && && && && &&&(正零和负零的反码相同)
& && && && && && && && && && && && && && &+1
0的补码为& && && && && &(舍掉打头的1,正零和负零的补码相同)
Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
例如补码的十进制数为-1转换为int时变为好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。
和0xff相与后,高24比特就会被清0了,结果就对了。
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。
而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。
Author: orangelizq
欢迎大家访问我的个人网站
阅读(53675)
&re: [转]java中byte转换int时为何与0xff进行与运算
怎么就造成误差了呢?如果把0xffffffff来个substring(6)操作,如何?&&&&&&
&re: [转]java中byte转换int时为何与0xff进行与运算
反码、补码。。。晕&&&&&&
&re: [转]java中byte转换int时为何与0xff进行与运算
谢谢 ,还好计算机导论没忘记&&&&&&
&re: [转]java中byte转换int时为何与0xff进行与运算[未登录]
扫盲了&&&&&&
&re: [转]java中byte转换int时为何与0xff进行与运算
不还是-1么?会出什么问题呢?&&&&&&
&re: [转]java中byte转换int时为何与0xff进行与运算
多谢了,哈哈&&&&&&
&re: [转]java中byte转换int时为何与0xff进行与运算
java二进制1开头最大的数才是-1吧100.....001是最小的负数&&&&&&
&re: [转]java中byte转换int时为何与0xff进行与运算
代表的就是-1?是这样吗?确定-1的byte在java里面不是?&&&&&&
&re: [转]java中byte转换int时为何与0xff进行与运算
lz你是在害人阿~ “代表的就是-1 ”&&&&&&
2930123456891011121314151718192122232425262728293031123456789
随笔分类(124)
随笔档案(127)
文章分类(5)
文章档案(5)
积分与排名
阅读排行榜博客分类:
public static String bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i & b. i++) {
String hex = Integer.toHexString(b[ i ] & 0xFF);
if (hex.length() == 1) {
hex = '0' +
ret += hex.toUpperCase();
上面是将byte[]转化十六进制的字符串,注意这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算,
然后使用Integer.toHexString取得了十六进制字符串,可以看出b[ i ] & 0xFF运算后得出的仍然是个int,
那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?
答案是不行的.
其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的数字类型:正数在计算机中是以原码形式存在的,负数在计算机中是以其补码形式存在的
在这里先温习下计算机基础理论
byte是一个字节保存的,有8个位,即8个0、1。
8位的第一个位是符号位,
也就是说代表的是数字1
代表的就是-1
所以正数最大位,也就是数字127,
负数最大为,也就是数字-128
上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码
一个数如果是正,则它的反码与原码相同;
一个数如果是负,则符号位为1,其余各位是对原码取反;
2、补码:利用溢出,我们可以将减法变成加法
对于十进制数,从9得到5可用减法:
因为4+6=10,我们可以将6作为4的补数
改写为加法:
9+6=15(去掉高位1,也就是减10)得到5.
对于十六进制数,从c到5可用减法:
因为7+9=16 将9作为7的补数
改写为加法:
c+9=15(去掉高位1,也就是减16)得到5.
在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(),进位1被丢弃。
⑴一个数为正,则它的原码、反码、补码相同
⑵一个数为负,补码为:负数的绝对值的反码加1
- 1的原码为
- 1的反码为
- 1的补码为
它在计算机中的存储就是 ,
-10 绝对值10 原码:
再加1后:,此为-10补码,
好的,计算机中的就是代表-10了。
绝对值128的二进制表示: 按位取反
也就是说 -128在计算机中的表示就是
Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,
由于int是32位,而byte只有8位这时会进行补位,
例如补码的十进制数为-1转换为int时变为好多1啊,呵呵!
即0xffffffff但是这个数是不对的,这种补位就会造成误差。和0xff相与后,高24比特就会被清0了,结果就对了。
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,
如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,
举例来说,一个byte的-1(即0xff),会被转换成int的-1(即 0xffffffff),那么转化出的结果就不是我们想要的了。
而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,
这样,结果中的高的24个比特就总会被清0, 于是结果总是我们想要的。
浏览 135548
"即0xffffffff但是这个数是不对的,这种补位就会造成误差。和0xff相与后,高24比特就会被清0了,结果就对了"这句话不懂,无论是“0xffffffff”还是“0xff”,转化为int都表示-1啊,假设byte-1 与oxff相与,转化为整形时,高的24位被清零,那么相与的结果为0x00 00 就是整型255了,也就是byte-1 和int 255 等价?能不能举个例子说明下不对的原因呢?以我的理解,这个方法是要把byte数以16进制形式打印,但是Byte类并不提供直接转化为16进制数的方法,所以要通过Integer类的toHexString方法来实现,故此要先把这个byte数转化为Integer类型,但是如果直接转化为Integer类型的话就会像上文说的那样0xff变成了0xffffffff,这样打印出来明显与初衷不符,所以要使用0xff来做与运算,而0xff是个int型数,它的补码即这个数在JVM中的表现形式为:00 00
,故此与运算后高24位清0,后8位保持原样,所以转化为16进制时仍为0xff。使用这种方法得到的int数的值不再是原值,因为与0xff做按位与运算实际上=*(-255),所以只有当你想要获得一个byte数的二进制或16进制表现形式时,可以使用这种方法。
perfect5085
浏览: 230953 次
来自: 杭州
所以正数最大位,也就是数字127,
负数最 ...
[b][flash=200,200][list][*]引用[/ ...
呃,错了,按位与0xff不等于*(-255)
ftutor 写道&即0xffffffff但是这个数 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'byte a , b.把这两个byte转换成一个short,a作为高8位,转换的时候 ( (a & 0xff) && 8 ) | ( b & 0xff) )_百度知道
byte a , b.把这两个byte转换成一个short,a作为高8位,转换的时候 ( (a & 0xff) && 8 ) | ( b & 0xff) )
这个& 0xff 的意义是什么?
我有更好的答案
与0xff是十六进制即11 1111将a与这个数相与得到十六位的数如a=3则a为相与和为00 0011再左移8位得到00 0000再与b和oxff相与的结果或
如果我不和0xff与的话呢?结果一样吧?能说明下&0xff的意义和必要性吗?0xff是11 1111吧? 怎么会是11 1111?我的理解有误?
采纳率:26%
类似的还有|(或)&是位运算符 与,1&0=0,1&1=1
,!(非)。当&作为位运算时
本回答被网友采纳
0xff 换成十六进制是0x
a& 0xff 操作的意思就是取a的第八位,高位全部清零
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 2g内存是多少字节 的文章

 

随机推荐