搜索
bottom↓
回复: 21

一个32位的数据,只想取其中的8-15位,该如何处理?

[复制链接]

出0入0汤圆

发表于 2017-6-9 15:15:50 | 显示全部楼层 |阅读模式
本帖最后由 rjx 于 2017-6-9 15:36 编辑

本人C学的不好,请教一个极其简单的问题:
有一个32位的数据 :u32  abc,  我只需要其中的8-15位,请问有什么简单的办法得到里面的8-15位。望不吝赐教,先谢谢了。

出0入0汤圆

发表于 2017-6-9 15:20:27 | 显示全部楼层
uint temp;
temp = (uint)(abc>>8);

出0入0汤圆

发表于 2017-6-9 15:22:56 | 显示全部楼层
uchar a=(uchar)(abc>>8);

出0入0汤圆

发表于 2017-6-9 15:27:37 | 显示全部楼层
问题确实简单,但楼主的标题不合格,赶紧修改吧,不然会被封ID的

出0入0汤圆

发表于 2017-6-9 15:30:32 | 显示全部楼层
uint8_t result = (uint8_t)(param>>8);

出0入0汤圆

发表于 2017-6-9 15:50:28 | 显示全部楼层
1,移位结合&0XFF
2,定义个结构体,用字段。

出0入0汤圆

发表于 2017-6-9 18:35:33 | 显示全部楼层
最近简单的:
uchar data8_15;
data8_15 = *((unsigned char *)(&abc)+1);

出0入0汤圆

发表于 2017-6-9 18:48:07 | 显示全部楼层
右移8位后取低8位即可。

出0入0汤圆

发表于 2017-6-9 22:23:24 | 显示全部楼层
huangguimina4 发表于 2017-6-9 18:35
最近简单的:
uchar data8_15;
data8_15 = *((unsigned char *)(&abc)+1);

你这个写法还要考虑大小端的问题吧

出20入22汤圆

发表于 2017-6-9 22:52:23 | 显示全部楼层
楼主没说要中间的还是两头的

出0入0汤圆

发表于 2017-6-9 23:05:35 | 显示全部楼层
gyzzg2030 发表于 2017-6-9 22:52
楼主没说要中间的还是两头的

楼主的意思应该是想读取D8到D15一个字节的内容,不是说读取任意8到15位数据

出0入0汤圆

发表于 2017-6-10 00:01:41 来自手机 | 显示全部楼层
C和C++有个东西叫位域或位段,bit field,这个和联合体一起用。

出0入0汤圆

发表于 2017-6-10 03:36:28 | 显示全部楼层
huangguimina4 发表于 2017-6-9 18:35
最近简单的:
uchar data8_15;
data8_15 = *((unsigned char *)(&abc)+1);

你这是自找麻烦,Big-endian and little-endian ......

出0入0汤圆

发表于 2017-6-10 09:28:29 | 显示全部楼层
浮生莫若闲 发表于 2017-6-9 22:23
你这个写法还要考虑大小端的问题吧

编译预定义   

出0入0汤圆

发表于 2017-6-10 09:30:35 | 显示全部楼层
本帖最后由 weichao4808335 于 2017-6-11 14:11 编辑

用位域  想搞那些位就搞那些,左移 右移多麻烦

出0入0汤圆

发表于 2017-6-10 09:35:51 | 显示全部楼层
楼上正解

出0入0汤圆

发表于 2017-6-10 10:30:58 来自手机 | 显示全部楼层
C语言 - 结构体(struct)的位字段(:) 详解 发表于2014/5/23 17:02:14  2904人阅读 结构体(struct)的位字段(:) 详解  本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511  结构体(struct)可以使用位字段(:), 节省空间, 如以下代码,  结构体a中的, 第一个变量x占用1个字符, y占用2个字符, z占用33个字符(越界); 但是sizeof()会自动补齐, 如x+y一共占用4个字节, z占用8个字节, 所以结构体占用12个字节; 当使用加法运算时, 会初始化为0;  代码: /*  * test.cpp  *  *  Created on: 2014.05.23  *      Author: Spike  */  /*eclipse cdt, gcc 4.8.1*/  #include <iostream> #include <stdio.h>  using namespace std;  struct a {         int x:1;         int y:2;         int z:33; };  int main() {         a d;         cout << &d << std::endl;         d.z = d.x + d.y;         printf("%d %d %d %d\n", d.x, d.y, d.z, sizeof(d));          return 0; }  输出: 0x22fed4 0 0 0 12

出0入0汤圆

发表于 2017-6-11 12:44:51 | 显示全部楼层
weichao4808335 发表于 2017-6-10 09:30
用位域  想搞那些位就搞那些,左移 右移多麻烦,用位域还不用考虑什么大小端 ...

不知道你说的不用考虑大小端的位域怎么写,请写一段

出0入4汤圆

发表于 2017-6-11 12:54:53 | 显示全部楼层
hd12 发表于 2017-6-11 12:44
不知道你说的不用考虑大小端的位域怎么写,请写一段

用位域一样也要考虑大小端吧

出0入0汤圆

发表于 2017-6-11 12:57:08 | 显示全部楼层
laujc 发表于 2017-6-11 12:54
用位域一样也要考虑大小端吧

是啊,我知道的方法也是要分大小端。

出0入4汤圆

发表于 2017-6-11 12:59:35 | 显示全部楼层
hd12 发表于 2017-6-11 12:57
是啊,我知道的方法也是要分大小端。

反倒是移位和除法运算不需要考虑大小端
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-30 22:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表