什么是低八位和高八位?

ProgrammingRing 2009-07-12 12:25:40
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
union
{
int i;
struct
{
char first;
char second;
}sql_l;
}number;
number.i=0x4445;
printf("%c%c%x\n",number.sql_l.first,number.sql_l.second,number.i);
number.sql_l.first='c';
number.sql_l.second='d';
printf("%x\n",number.i);
system("pause");
return 0;
}

程序的输出结果为:
ED4445
6463
从上面的结果可以看出:当给i赋值后,其低八位是first的值,而高八位是second的值,
当给first和second赋字符后,i的值也跟随发生变化。
===================================================
上面是书上的一个例题,我不明白他说的这句话"其低八位是first的值,而高八位是second的值"什么是低八位?什么是高八位?该怎么判断它是低八位还是高八位呢?去百度查,不知这是属于那方面的知识,新人不解,请详解!
...全文
5793 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
qw12300er 2012-08-02
  • 打赏
  • 举报
回复
0x4455 二进制形式-->0100 0100 0101 0101 (正解)
shine8008 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yangkunhenry 的回复:]
0x4455  二进制形式-->0100 0100 0100 0101
从右往左数是从第0位到第15位,红的是高八位,蓝的是低八位
[/Quote]
这个结果是不是算的不对?
nouce 2009-07-13
  • 打赏
  • 举报
回复
UP
ProgrammingRing 2009-07-13
  • 打赏
  • 举报
回复
哦..谢谢各位了
meipen 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Arnold9009 的回复:]
这个问题跟union的存储方式有关
union在存储的时候,在内存中开辟的是union中最长类型的字节数,所有的成员共用这个空间

这个例子里,union在内存中开辟的是一个int类型的空间(一般是4字节),sql_l与i共用这个4字节的空间,但是由于sql_l只占用2个字节,
所以sql_l的成员first占用低8位(就是Byte0),second占用高8位(就是Byte1);

union只存储最新的成员的值,所以修改某个成员的时候,会导致其他成员的值变化
[/Quote]
二楼说的已经非常好了,我再补充一点
只是计算机为了方便存储 采用“低地址存放低字节,高地址存放高字节”机制
并且地址的顺序是从左到右 你可以把地址看成二维数组一样
但是正常分解数据为二进制
(5)的二进制
0000 0000 | 0000 0101
(高8位) (低八位)
所以会有“其低八位是first的值,而高八位是second的值”
yangkunhenry 2009-07-12
  • 打赏
  • 举报
回复
0x4455 二进制形式-->0100 0100 0100 0101
从右往左数是从第0位到第15位,红的是高八位,蓝的是低八位
Arnold9009 2009-07-12
  • 打赏
  • 举报
回复
这个问题跟union的存储方式有关
union在存储的时候,在内存中开辟的是union中最长类型的字节数,所有的成员共用这个空间

这个例子里,union在内存中开辟的是一个int类型的空间(一般是4字节),sql_l与i共用这个4字节的空间,但是由于sql_l只占用2个字节,
所以sql_l的成员first占用低8位(就是Byte0),second占用高8位(就是Byte1);

union只存储最新的成员的值,所以修改某个成员的时候,会导致其他成员的值变化
Nio96 2009-07-12
  • 打赏
  • 举报
回复
晕。你把一个数按二进制展开就知道什么叫低八位,高八位了。。。
东大坡居士 2009-07-12
  • 打赏
  • 举报
回复
和机器的存储方式有关。。
wxdcxp 2009-07-12
  • 打赏
  • 举报
回复
把一个16进制的转换成二进制的数,左边是高位,右边是低位
tommylee28 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yangkunhenry 的回复:]
0x4455  二进制形式-->0100 01000100 0101
从右往左数是从第0位到第15位,红的是高八位,蓝的是低八位
[/Quote]
正解
qiyexinglang 2009-07-12
  • 打赏
  • 举报
回复
在struct
{
char first;
char second;
}sql_l;
中,first在second的前面,所以first占低8位了,second占高8位了。
gg606 2009-07-12
  • 打赏
  • 举报
回复
union
{
int i;
struct
{
char first;
char second;
}sql_l;
}number;

按下列方式给联合赋值后,
number.sql_l.first='c'; //0x63
number.sql_l.second='d'; //0x64
再按整数读取,读出来不是0x6364,而是0x6463,这是因为PC机(Intel)的二字节整数
在内存里的存储方式是低字节在前。
happypeter2008 2009-07-12
  • 打赏
  • 举报
回复
看不懂没见过
ProgrammingRing 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Arnold9009 的回复:]
这个问题跟union的存储方式有关
union在存储的时候,在内存中开辟的是union中最长类型的字节数,所有的成员共用这个空间

这个例子里,union在内存中开辟的是一个int类型的空间(一般是4字节),sql_l与i共用这个4字节的空间,但是由于sql_l只占用2个字节,
所以sql_l的成员first占用低8位(就是Byte0),second占用高8位(就是Byte1);

union只存储最新的成员的值,所以修改某个成员的时候,会导致其他成员的值变化
[/Quote]
汗..不是很明白..为什么是first占低位?而不是高位?
hynwpu 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yangkunhenry 的回复:]
0x4455 二进制形式-->0100 0100 0100 0101
从右往左数是从第0位到第15位,红的是高八位,蓝的是低八位
[/Quote
就三楼说的。
Walf_ghoul 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yangkunhenry 的回复:]
0x4455 二进制形式-->0100 0100 0100 0101
从右往左数是从第0位到第15位,红的是高八位,蓝的是低八位
[/Quote]
。。。。。
wisaa 2009-07-12
  • 打赏
  • 举报
回复
2楼跟3楼的回答加一起
starcat 2009-07-12
  • 打赏
  • 举报
回复
汗!看错了,把分号看成“:”

难怪觉得这个“bit field”长得有点奇怪。
starcat 2009-07-12
  • 打赏
  • 举报
回复
楼主的程序里的struct是个位域吧;
1个char占1Byte,两个就是2乘8bit等于16位;
从右到左的两个Byte分别就是低八位和高八位。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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