C语言编程中的8位、16位、32位整数的分解与合并

2023-11-04

  在单片机的编程中对于8位、16位、32位整数的分解与合并用的比较多,今天做了简要学习,后面还需要加以总结。

  练习在VC++6.0编程环境中进行,源程序:

#include <stdio.h>
#include "string.h"

int main(int argc, char* argv[])
{    
	  unsigned int Data_Uint32=0x12345678;
	  unsigned short int Data_Uint16_1,Data_Uint16_2;
	  unsigned char Data_Uint8_1,Data_Uint8_2,Data_Uint8_3,Data_Uint8_4;
	  struct StructByte8{
		  unsigned char Byte01:1;
		  unsigned char Byte02:1;
		  unsigned char Byte03:1;
		  unsigned char Byte04:1;
		  unsigned char Byte05:1;
		  unsigned char Byte06:1;
		  unsigned char Byte07:1;
		  unsigned char Byte08:1;
	  } Test1;
      unsigned char C1[]="A";
      //定义16位的指针将32位地址强制转为16位,高位丢弃取低位
	  unsigned short int *p16=(unsigned short int *)(&Data_Uint32);
	  unsigned short int Data_Uint16_2p,Data_Uint16_1p;

	  printf("32位整数:0x%x\n",Data_Uint32);
	  printf("-------------------通过指针运算-------------------\n");
	  Data_Uint16_2p=*(unsigned short int *)p16;
	  Data_Uint16_1p=*((unsigned short int *)p16+1);
	  printf("转换后的16位整数:0x%x,0x%x\n",Data_Uint16_1p,Data_Uint16_2p);

	  Data_Uint8_1= *(unsigned char *)p16;
	  Data_Uint8_2= *((unsigned char *)p16+1);
	  Data_Uint8_3= *((unsigned char *)p16+2);
	  Data_Uint8_4= *((unsigned char *)p16+3);
	  printf("转换后的8位整数:0x%x,0x%x,0x%x,0x%x\n",Data_Uint8_1,Data_Uint8_2,
                                                     Data_Uint8_3,Data_Uint8_4);
	  Data_Uint8_1=0;Data_Uint8_2=0;Data_Uint8_3=0;Data_Uint8_4=0;
	  //直接根据指针取值
	  //将32位的整数分解成两个16位的整数,再取低位的16位
	  //强制转换,丢弃高位的16位
	  //32位转16位
	  Data_Uint16_1=(unsigned short int)(Data_Uint32>>16);
	  Data_Uint16_2=(unsigned short int)Data_Uint32;

	  //32位转8位
	  Data_Uint8_1= (unsigned char)(Data_Uint32>>24);
	  Data_Uint8_2= (unsigned char)(Data_Uint32>>16);
	  Data_Uint8_3= (unsigned char)(Data_Uint32>>8);
	  Data_Uint8_4= (unsigned char)Data_Uint32;

	  printf("-------------------通过位运算-------------------\n");
	  printf("转换后的16位整数:0x%x,0x%x\n",Data_Uint16_1,Data_Uint16_2);
	  printf("转换后的8位整数:0x%x,0x%x,0x%x,0x%x\n",Data_Uint8_1,Data_Uint8_2,
                                                    Data_Uint8_3,Data_Uint8_4);
	  
	  printf("-------------------通过结构运算-------------------\n");     
	  printf("字符A,ASCII为01000001,结构转换后的内容\n");  
      memcpy(&Test1, C1, sizeof(Test1));  
	  printf("Test1.Byte08=%d \n",Test1.Byte08);  
	  printf("Test1.Byte07=%d \n",Test1.Byte07);  
	  printf("Test1.Byte06=%d \n",Test1.Byte06);  
	  printf("Test1.Byte05=%d \n",Test1.Byte05);  
	  printf("Test1.Byte04=%d \n",Test1.Byte04);  
	  printf("Test1.Byte03=%d \n",Test1.Byte03);  
	  printf("Test1.Byte02=%d \n",Test1.Byte02);  
	  printf("Test1.Byte01=%d \n",Test1.Byte01);  
      
	  Data_Uint8_1=0x89;Data_Uint8_2=0xAB;Data_Uint8_3=0xCD;Data_Uint8_4=0xEF;
	  printf("-------------------通过位运算合并-------------------\n");
	  Data_Uint16_1 = (unsigned short int)(Data_Uint8_1 << 8) | (unsigned short int)(Data_Uint8_2);
	  Data_Uint16_2 = (unsigned short int)(Data_Uint8_3 << 8) | (unsigned short int)(Data_Uint8_4);
	  Data_Uint32=(unsigned int) (Data_Uint16_1 << 16) | (unsigned int)(Data_Uint16_2);
	  printf("合并前的8位整数:0x%x,0x%x,0x%x,0x%x\n",Data_Uint8_1,Data_Uint8_2,Data_Uint8_3,Data_Uint8_4);
	  printf("合并后的16位整数:0x%x,0x%x\n",Data_Uint16_1,Data_Uint16_2);
	  printf("合并后的32位整数:0x%x\n",Data_Uint32);

	return 0;
}

输出:

在这里练习以后进入Keil uVision5编程,想写个通用的转换函数,后面想没有必要,难道8、16位、32位相互转换这么复杂吗?如果这样,写在Keil uVision5里面的程序会是多么复杂,以后自己看起来也会繁琐的。

接着写:

直接强制转换:

	  printf("-------------------8位到32位转换-------------------\n");
	  Data_Uint8_1=0x00;
	  Data_Uint8_2=0x19;
	  Data_Uint16_2=0x00;
	  Data_Uint16_1 = (unsigned short int)(0x00 << 8) | (unsigned short int)(Data_Uint8_2);
      Data_Uint32=(unsigned int) (0x00 << 16) | (unsigned int)(Data_Uint16_1);
	  printf("转换前的8位整数:0x%x,%d\n",Data_Uint8_2,sizeof(Data_Uint8_2));
	  printf("8位到32位转换1======>转换后的32位整数:0x%x,数据长度:%d\n",Data_Uint32,sizeof(Data_Uint32));
	  Data_Uint32=(unsigned int) (0x00 << 16) | (unsigned int)( (unsigned short int)(0x00 << 8) | (unsigned short int)(Data_Uint8_2));
	  printf("8位到32位转换2======>转换后的32位整数:0x%x,数据长度:%d\n",Data_Uint32,sizeof(Data_Uint32));
	  //Data_Uint32=(unsigned int) (0x00 << 24) | (unsigned int)(Data_Uint8_2);
	  Data_Uint32= (unsigned int)(Data_Uint8_2);
	  printf("8位到32位转换3======>转换后的32位整数:0x%x,数据长度:%d\n",Data_Uint32,sizeof(Data_Uint32));
      Data_Uint32=0x69;
      Data_Uint8_1= (unsigned char)(Data_Uint32);
	  printf("32位整数:0x%x,数据长度:%d\n",Data_Uint32,sizeof(Data_Uint32));
	  printf("32位到8位转换======>转换后的8位整数:0x%x,数据长度:%d\n",Data_Uint8_1,sizeof(Data_Uint8_1));

实际输出:

-------------------8位到32位转换-------------------
转换前的8位整数:0x19,1
8位到32位转换1======>转换后的32位整数:0x19,数据长度:4
8位到32位转换2======>转换后的32位整数:0x19,数据长度:4
8位到32位转换3======>转换后的32位整数:0x19,数据长度:4
32位整数:0x69,数据长度:4
32位到8位转换======>转换后的8位整数:0x69,数据长度:1

 

说明:8位强制转32位,前面系统自动加了24位的0;32位强制转8位,系统只截取了最后的8位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言编程中的8位、16位、32位整数的分解与合并 的相关文章

  • ZedGraph 缩放和调整大小

    当我绘制图形 放大和缩小并重新绘制图形时 图形的位置不会改变 我想要做的是 每当重新绘制数据时 视图都会更改以查看所有图形数据 如果您在重绘之前放大或缩小 这似乎会被禁用 Thanks 设置属性 IsZoomOnMouseCenter对于控
  • 对相当大的整数的大集合的操作的快速实现

    描述 我实现了以下类 LabSetInt64 参见下面的代码 这里的目标是尽可能快地操作大量大整数 最多 10M 的值 我的主要要求集中在 至关重要 尽快获取集合的大小 基数 重要 能够非常快速地迭代一组集合 所以 从下面的实现开始 我还有
  • 将 LINQ to Entities 查询中的每个项目转换为接口的最佳方法是什么?

    我有一个实现 IUser 的实体对象 User IQueryable
  • 如何获取任意类型的默认值

    在 C 中我可以写这样的东西 class AnyThing
  • 设置外部应用程序焦点

    在 VB NET 中 您可以使用以下命令将焦点设置到外部应用程序 AppActivate Windows Name or AppActivate processID As Integer 现在 如果您这样做 则效果很好 Dim intNot
  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • 有哪些 API 可在 Windows 中使用 C# 配置扬声器设置?

    我环顾了很多不同的地方 但似乎找不到一个简单的方法来做到这一点 我在 Windows 7 中有多个声卡 并使用 HDMI 将声音输出到我的 AVR 放大器 我遇到的问题是 当放大器关闭时 它会导致窗口丢失扬声器配置 所以我想做的是编写一个小
  • 整数与双精度算术性能?

    我正在编写一个 C 类来使用整数执行 2D 可分离卷积 以获得比双对应更好的性能 问题是我没有获得真正的性能提升 这是 X 过滤器代码 对于 int 和 double 情况都有效 foreach pixel int value 0 for
  • “volatile void function( ... )” 做了什么?

    我见过从语法角度来看 C 函数中 volatile 关键字有多少种用法 https stackoverflow com questions 7643528 how many usage does volatile keyword have
  • 编译器在函数名称前添加下划线前缀的原因是什么?

    当我看到 C 应用程序的汇编代码时 如下所示 emacs hello c clang S O hello c o hello s cat hello s 函数名称以下划线作为前缀 例如callq printf 为什么这样做以及它有什么优点
  • 使用 for 循环创建链表

    这是我的结构 struct ListItem int data struct ListItem next 假设链表的第一个节点的 data 0 我想编写一个 for 循环来创建大小为 5 的链表 但我不知道如何工作 我尝试了以下方法 int
  • DLL 中的 XP 风格组合框

    我需要使用 C 和 WIN32 API 无 MFC 在 DLL 中创建 XP 风格的组合框 我设法在 DLL 中创建控件 不是以 XP 风格 我设法在带有清单的 exe 中创建 XP 样式组合框 但它在 DLL 中不起作用 为了让您的 DL
  • C语言:如何获取使用strtok()一次后剩余的字符串

    我的字符串是 A B C D E 分隔符是 如何获取执行 strtok 一次后剩余的字符串 即 B C D E char a A B C D E char separator char b strtok a separator printf
  • 一个对大文件有效的轻量级 XML 解析器?

    我需要解析潜在的巨大 XML 文件 所以我猜这排除了 DOM 解析器 是否有任何优秀的 C 轻量级 SAX 解析器 在占用空间上可与 TinyXML 相媲美 XML的结构非常简单 不需要诸如命名空间和DTD之类的高级东西 只是元素 属性和
  • 如何从句柄确定进程是 32 位还是 64 位?

    如何从使用 OpenProcess 获取的进程句柄中获取信息 无论进程是 32 位还是 64 位 是的 IsWow64Process 毫无用处 令人烦恼 它的真正意思是 启用了 32 位模拟 如果您在 32 位操作系统上运行 则返回 fal
  • 使用std::begin()、std::end()将ArrayXd转换为stl向量,

    在我看来我应该能够使用std begin and std end 转换ArrayXd to std vector
  • 检测用户是否正在滚动 dataGridView 滚动条

    我正在更新一个dataGridView与一个新的数据表使用 dataGridView1 DataSource table 但是 我不想在用户滚动 dataGridView 时执行此操作 如何检查滚动条是否正在滚动或已完成滚动 即拖动而不是单
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • 字符串常量之前应有非限定 ID

    我目前正在编写一个 C 应用程序 它与 math h 结合实现了振荡器 我拥有的代码应该可以很好地用于该应用程序 尝试编译目标文件 但是我遇到编译器错误 很可能与语法 等有关 我认为这与命名空间有关 错误 终端输出 User Name Ma
  • “保留供任何使用”是什么意思?

    注意 这是一个c questions tagged c问题 虽然我补充说c questions tagged c 2b 2b如果某些 C 专家可以提供 C 使用与 C 不同的措辞的基本原理或历史原因 在 C 标准库规范中 我们有这个规范文本

随机推荐

  • 论文收录引用证明常见问题汇总

    学术论文在毕业 评职称 保研 考博 留学等方面均有重要意义 因此往往需要开具检索证明 然而 开具检索证明的前提是论文必须被收录 1 什么是论文收录引用证明 论文收录引用证明是用来证明作者在科研领域中的实力和成就 当用户需要查询其论文在指定数
  • 单链表实现多项式相加

    这个小项目用C语言实现 代码中有我的注释 思路 用链表的每个节点存储表达式的每一项 因此每个链表就是一个表达式 链表节点类型的定义 struct Node DataType elem 项的系数 Variate ch 常量和变量的标志 规定如
  • rand()每次产生的随机数都一样

    写了个程序 每次产生的随机数都是一样的 在调用之前已经初始化了随机数种子 用的是当前时间 可是还是得到一样的数 for int i 0 i lt 100000 i srand unsigned time NULL cout lt
  • shiro入门

    1 概述 Apache Shiro 是一个功能强大且易于使用的 Java 安全 权限 框架 借助 Shiro 您可以快速轻松地保护任何应用程序一一从最小的移动应用程序到最大的 Web 和企业应用程序 作用 Shiro可以帮我们完成 认证 授
  • Vue中获取input输入框值

  • 一个“制作午餐”的故事,帮助你理解并发和并行(上)

    导读 这是一个关于 午餐时间 的小故事 用于阐述 threading asyncio multiprocessing cloud functions 等内容 为了方便阅读并理解文章的内容 全文分上 下两篇 上篇主要讲解并发 下篇重点讲解并行
  • runtime交换方法的正确姿势

    runtime交换方法的正确姿势 说到Objective C大家就会想到黑魔法runtime 不知道runtime是什么的看这里 runtime是开源的 源码在这里 本文主要讲解如何利用runtime正确的交换方法 将会提到两种方式去交换
  • 在Linux的终端中显示BMPString的内容

    在上一篇博文中 介绍了如何在 Windows 的控制台界面下输出 BMPString 的内容 但是那里的方法在 Linux 下不适用 如果将那里的示例代码放到 Linux 下执行 输出的结果为乱码 产生乱码的原因在于 wchar t 类型的
  • 数据挖掘——第一章:概述

    文章目录 1 数据分析与数据挖掘 1 1 数据分析 1 2 数据挖掘 1 3 知识发现 KDD 的过程 1 4 数据分析与数据挖掘的区别 1 5 数据分析与数据挖掘的联系 2 分析与挖掘的数据类型 2 1 数据库数据 2 2 数据仓库数据
  • 思科网络配置简单学习

    一 VLAN 什么是VLAN 虚拟局域网 为什么要引入VLAN 1 交换机分割了冲突域 但是不能分割广播域 2 交换机端口数量增多 网络中广播增多 降低了网络的效率 3 目的为了分割广播域 VLAN的优势 广播控制 提高安全性 提高带宽利用
  • UDP \TCP详详详详解,你想要的全都有(呕心沥血)

    前言 因特网为应用层提供了两种截然不同的可用运输层协议 一个是UDP 用户数据报协议 一个是TCP 传输控制协议 这两种协议无论是在开发过程中 还是面试问答中 都相当重要 先了解两个定义 多路分解 将运输层报文段中的数据交付到正确的套接字
  • 2023 年 30 种顶级自动化测试工具

    当您想运行测试自动化时 天空是极限 甚至超越极限 技术发展如此之快 与 10 年前相比 您可以减少时间并保持更高的工作效率 如果 Selenium 是您首选的自动化测试工具 您就不必忍受 Selenium 给您带来的限制 相反 您可以从各种
  • Python基础知识(一):变量与赋值、运算符、数据类型及位运算

    学习目标 了解python的基本概念 变量类型 运算符 及数据类型 了解python的位运算 原码 反码和补码 注释 在 Python 中 表示注释 作用于整行 或者 表示区间注释 在三引号之间的所有内容被注释 在Pycharm或者Jupy
  • matlab 安装mingw64

    1 下载mingw64 MinGW w64 for 32 and 64 bit Windows download SourceForge net 解压到没有空格的路径 好像必须在c盘 否则可以出现 错误使用 configuremingw 无
  • List元素为类对象,按照类对象属性去重的解决办法

    很多小伙伴在开发中会遇到一个场景 就是List集合中存储的是类对象 我们想要根据类对象属性去重 这种场景该如何做呢 解决办法 大家都知道对象的equals默认是按照对象的应用地址去进行比较的 所以想要对象去重 关键就在于重写equals方法
  • 三极管驱动继电器详解

    http www 21ic com jichuzhishi analog basic 2015 08 24 638790 html
  • 基于STM32的多功能心电信号监测系统设计

    1 系统总体方案设计 系统由STM32F103微处理器模块 ADS1292R心电采集模块 LMT70体表温度传感器模块 ESP8266无线WiFi模块 MMA955L加速度计模块 系统电源 PC服务端等组成 STM32F103作为主控制器实
  • 2.4 Verilog HDL语句

    语句 1 赋值语句 结构说明语句 阻塞与非阻塞 1 1 赋值语句 1 1 1 连续赋值语句assign 1 1 2 过程赋值语局 和 lt 1 2 结构说明语句 1 2 1 结构说明语句always 1 2 2 结构说明语句initial
  • 【机器学习】噪声数据的理解

    文章目录 一 噪声数据 1 1 分箱 1 2 回归 1 3 聚类 1 4 其他 二 数据清理作为一个过程 2 1 偏差检测 2 1 1 使用 元数据 关于数据的数据 2 1 2 编码格式 存在使用不一致 数据表示不一致 2 1 3 字段过载
  • C语言编程中的8位、16位、32位整数的分解与合并

    在单片机的编程中对于8位 16位 32位整数的分解与合并用的比较多 今天做了简要学习 后面还需要加以总结 练习在VC 6 0编程环境中进行 源程序 include