C语言之C语言的底层操作

概述

C语言的内存模型基本上对应了现在von Neumann(冯·诺伊曼)计算机的实际存储模型,很好的达到了对机器的映射,这是C/C++适合做底层开发的主要原因,另外,C语言适合做底层开发还有另外一个原因,那就是C语言对底层操作做了很多的的支持,提供了很多比较底层的功能。

下面结合问题分别进行阐述。

问题:移位操作

在运用移位操作符时,有两个问题必须要清楚:

(1)、在右移操作中,腾空位是填 0 还是符号位;

(2)、什么数可以作移位的位数。

答案与分析:

">>"和"<<"是指将变量中的每一位向右或向左移动, 其通常形式为:

右移: 变量名>>移位的位数

左移: 变量名<<移位的位数

经过移位后, 一端的位被"挤掉",而另一端空出的位以0 填补,在C语言中的移位不是循环移动的。

(1) 第一个问题的答案很简单,但要根据不同的情况而定。如果被移位的是无符号数,则填 0 。如果是有符号数,那么可能填 0 或符号位。如果你想解决右移操作中腾空位的填充问题,就把变量声明为无符号型,这样腾空位会被置 0。

(2) 第二个问题的答案也很简单:如果移动 n 位,那么移位的位数要不小于 0 ,并且一定要小于 n 。这样就不会在一次操作中把所有数据都移走。

比如,如果整型数据占 32 位,n 是一整型数据,则 n << 31 和 n << 0 都合法,而 n << 32 和 n << -1 都不合法。

注意即使腾空位填符号位,有符号整数的右移也不相当与除以 。为了证明这一点,我们可以想一下 -1 >> 1 不可能为 0 。

问题:位段结构

struct RPR_ATD_TLV_HEADER
{
ULONG res1:6;
ULONG type:10;
ULONG res1:6;
ULONG length:10;
};

位段结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构比按位运算符更加方便。

位结构定义的一般形式为:

struct位结构名{
    数据类型 变量名: 整型常数;
    数据类型 变量名: 整型常数;
} 位结构变量; 

其中: 整型常数必须是非负的整数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。

变量名是选择项, 可以不命名, 这样规定是为了排列需要。

例如: 下面定义了一个位结构。

struct{
    unsigned incon: 8; /*incon占用低字节的0~7共8位*/
    unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
    unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
    unsigned blink: 1; /*blink占用高字节的第7位*/
}ch;

位结构成员的访问与结构成员的访问相同。

例如: 访问上例位结构中的bgcolor成员可写成:

ch.bgcolor 

位结构成员可以与其它结构成员一起使用。 按位访问与设置,方便&节省

例如:

struct info{
    char name[8];
    int age;
    struct addr address;
    float pay;
    unsigned state: 1;
    unsigned pay: 1;
}workers;'

上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。

注意不要超过值限制

时间: 2024-11-14 01:23:33

C语言之C语言的底层操作的相关文章

嵌入式-c语言和汇编都可以直接操作寄存器吗?二者有区别吗,怎么看是否能直接操作寄存器

问题描述 c语言和汇编都可以直接操作寄存器吗?二者有区别吗,怎么看是否能直接操作寄存器 图上的意思是C不能直接操作吗?还是说操作起来和汇编不一样 解决方案 可以使用C内嵌汇编来操作! 解决方案二: 你可以搜索一下C语言的编译过程http://www.cnblogs.com/littlehoom/p/3603391.html 解决方案三: 汇编操作寄存器可以用命令去操作,而C可以创建寄存器变量,自然也算是对寄存器的操作,另外C代码可以嵌入汇编代码 解决方案四: 编译过程:c->汇编->机器码 c

用C语言实现单链表的各种操作(二)_C 语言

上一篇文章<用C语言实现单链表的各种操作(一)>主要是单链表的一些最基本的操作,下面,主要是一些其他的典型的算法和测试程序. 复制代码 代码如下: /* 对单链表进行排序处理*/struct LNode *sort(struct LNode *head){  LinkList *p;  int n,i,j;  int temp;  n = ListLength(head);  if(head == NULL || head->next == NULL)    return head; 

利用C语言实现顺序表的实例操作_C 语言

本文实例讲述了C语言实现顺序表(线性表)的方法.分享给大家供大家参考,具体如下: 一:顺序表代码实现 #ifndef _SEQ_LIST_H #define _SEQ_LIST_H #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> #define ElemType float //以float类型测试算法通用性,而不是以惯用的int #define I

Swift语言指南(一)--语言基础之常量和变量

原文:Swift语言指南(一)--语言基础之常量和变量 Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swift 提供了 C 与 Objective-C 中的所有基础类型,包括表示整数的 Int,表示浮点数的 Double 与 Float,表示布尔值的 Bool,以及表示纯文本数据的 String. Swift 还为两个基本集合类型 Array 与 Dictionary 提供了强大的支持,详情可参考 (集合

java-spring框架下jsp脚本语言confirm脚本语言删除数据库中数据怎么做?

问题描述 spring框架下jsp脚本语言confirm脚本语言删除数据库中数据怎么做? spring框架下jsp脚本语言confirm脚本语言删除数据库中数据怎么做,具体说一说怎么写confirm脚本代码?求大神解答啊 解决方案 你的意思是点删除的时候弹出个确认对话框么?再跳一个Action实现真正的删除工作.还是想用ajax的方式实现无刷新删除-- 解决方案二: $(document).ready(function(){ //为注销用户超链接绑定click事件 $(".logoutid&qu

《面向ArcGIS的Python脚本编程》——1.3 脚本语言和程序语言

1.3 脚本语言和程序语言 面向ArcGIS的Python脚本编程Python作为一门程序语言,也常被称为脚本语言.那么,两者的区别在哪里呢?一般而言,脚本语言用于控制其他应用程序以实现任务自动化:而程序语言则是用于开发结构复杂.功能完备的应用程序.脚本语言是一种"粘合剂",它可以将不同的组件组合在一起,从而实现新的功能.而系统语言既可以从头构建组件,也可以将组件组装成不同的应用程序.系统语言(例如C++和.NET)通过计算机的低级图元和原始资源从头开始创建应用程序.脚本语言(例如Py

Java语言与C++语言的差异总结

Java的设计者曾说过,设计这门语言的灵感主要来自于C++. 世上先有C++,然后才有Java,整个Java语言的发展历史就是一部对C++的填坑史.所以在Java语言学习过程中,将其与C++语言对比是一件有意义的事情.通过这些对比,我们能够了解到Java语言相对于C++语言有哪些改进,能带给我们哪些进步,这样对于更加深入理解这两种语言是大有裨益的. 下面我总结一下Java语言与C++语言的各种差异. 1.Java用来操纵对象的引用可以先初始化再指向对象,而C++的引用必须在初始化时就指向对象.

C#语言与Java语言程序的比较

迈入二十一世纪以来,信息行业飞速壮大,其中在软件开发中Java语言与C#语言都独当一面,得到了逐步完善和广泛的应用,Java语言和C#语言都是一种面向对象的语言,但Java程序和C#程序还是有一定的区别. 下面分别是两种语言的程序的例子. 1.Java语言的基本程序: Import java.util.*; Package HelloJava{ Public class Message{ Public static void main(String [] args){ System.out.pr

Thinkphp搭建包括JS多语言的多语言项目实现方法_php实例

本文实例讲述了Thinkphp搭建包括JS多语言的多语言项目实现方法.分享给大家供大家参考.具体实现方法如下: 一.问题: 项目需要开发英文版,于是需要搭建多语言项目. 项目使用Thinkphp框架,隐约记得Thinkphp有多语言设置,翻看了帮助手册,果然有,这就边实验边开始: 二.实现方法: Thinkphp采用app_begain来检测和切换语言包,语言包和项目相关,构架等都比较简单,具体的这里:http://www.thinkphp.cn/info/188.html 搭建好了,就可以使用