int转byte,加&0xff?

coy_wang 2011-04-28 06:14:25
byte *m_pEncodeBytes; 
nPreamble=211;
m_pEncodeBytes[0]=byte(nPreamble&0xff); m_pEncodeBytes[1]=byte(0&0xff);
m_pEncodeBytes[2]=byte(m_nMsgLen&0xff);


看到这样代码,不明白为何后面都要加个0xff,求解!
...全文
4272 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdzfjfhnui 2011-04-29
  • 打赏
  • 举报
回复
coy_wang 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qq752923276 的回复:]

转为二进制就明白了

0xff:0000 0000 1111 1111

一个任意int数
0010 1000 0010 1010

&位操作的结果是双方的对应位均为1时才为1 否则为0

所以 上面那个任意数与0xff&的结果就是 0000 0000 0010 1010 于是便舍弃了任意数的高八位

实际int大多为4个字节 我这……
[/Quote]
的确是舍弃了任意数的高八位,这个我已经明白了,但因为byte本来就是8位的,高于8位的舍不舍又有什么区别呢?我就是不加&0xff,byte也只能接受int型的低8位,高8位本来就过不来啊,清不清零又有什么关系。
可能是个习惯问题?
Eleven 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 coy_wang 的回复:]
byte本来就只有8位
不加这个还不是只要后8位?
[/Quote]
应该是考虑了nPreamble可能超过了BYTE的范围
__lhy 2011-04-28
  • 打赏
  • 举报
回复
转为二进制就明白了

0xff:0000 0000 1111 1111

一个任意int数
0010 1000 0010 1010

&位操作的结果是双方的对应位均为1时才为1 否则为0

所以 上面那个任意数与0xff&的结果就是 0000 0000 0010 1010 于是便舍弃了任意数的高八位

实际int大多为4个字节 我这里懒得给上面的任意int数加0了 结果是一样的
coy_wang 2011-04-28
  • 打赏
  • 举报
回复
我就是不明白为何要加0xff
King_hhuang 2011-04-28
  • 打赏
  • 举报
回复
本来就可以强制转换,你试试


int a = -0x1223;
byte b=a;
byte c=byte(a&0xff);

ASSERT(b==c);
coy_wang 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mylanyuer 的回复:]
上面搞错了,是保留后7位,高位清零。

这个作用是避免符号位扩展:

比如,
char c = (char)-1 & 0xFF;
char d = (char)-1;

int(c)是255
int(d)是65535
[/Quote]

你的意思是将来这个byte再转回int的时候避免符号扩展?
coy_wang 2011-04-28
  • 打赏
  • 举报
回复
byte本来就只有8位
不加这个还不是只要后8位?
月中蓝 2011-04-28
  • 打赏
  • 举报
回复
上面搞错了,是保留后7位,高位清零。

这个作用是避免符号位扩展:

比如,
char c = (char)-1 & 0xFF;
char d = (char)-1;

int(c)是255
int(d)是65535
King_hhuang 2011-04-28
  • 打赏
  • 举报
回复
&按位与,就是取nPreamble最低一个字节;
例如int a=0x1223;
m_pEncodeBytes[0]=byte(a&0xff); 后m_pEncodeBytes[0]=0x23
月中蓝 2011-04-28
  • 打赏
  • 举报
回复
a&0xff
是只要a的后8位

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧