![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
文章平均质量分 84
fandelxin
不积跬步无以至千里
展开
-
C语言中.h和.c文件解析(很精彩)
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件) 4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用转载 2013-11-16 21:33:36 · 1688 阅读 · 1 评论 -
强制类型转换---看原子的IAP升级例程的问题所引发的测试
在看IAP升级时,看了下官方的例程,还参考了战舰板原子d原创 2014-06-16 16:18:46 · 1548 阅读 · 0 评论 -
关于二进制补码
问一个基本的问题。 负数在计算机中如何表示?举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢?很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。比如,在8位机中,规定每个字节的最高位为符号位。那么,+8就是00001000,而-8则是10001000。但是,随便找一本《计算机原理》,都会告诉你,实际上,转载 2014-07-30 15:49:06 · 1568 阅读 · 0 评论 -
关于C语言运算的自动提权及类型转换的问题
先上程序 Test1 = (uTest-4760); Test2 = (uTest-4760)/10; uTest = (uint32_t)(uTest-4760); Test3 = uTest/10; Test4 = 0;原创 2014-10-22 10:56:33 · 904 阅读 · 0 评论 -
循环冗余校验(CRC)算法入门引导
前言CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式。在嵌入式软件开发中,经常要用到CRC 算法对各种数据进行校验。因此,掌握基本的CRC算法应是嵌入式程序员的基本技能。可是,我认识的嵌入式程序员中能真正掌握CRC算法的人却很少,平常在项目中见到的CRC的代码多数都是那种效率非常低下的实现方式。其实,在网上有一篇介绍CRC 算法的非常好的文章,作者是Ross William转载 2014-10-14 23:05:34 · 976 阅读 · 0 评论 -
二维数组指针
二维数组指针 概括的说,指针其实就是可变数组的首地址,说是可变数组,是 指其包含内容的数量的可变的,并且是可动态申请和释放的,从而充 分节约宝贵的内存资源。我一向喜欢一维数组,除非万不得已,我一 般是不用二维数组的,多维的则更是很少涉足了。因为一维简单,容 易理解,而用指针指向的多维数组就具有相当的复杂性了,也因此更 具有讨论的必要。 闲话少说,这里我就以三转载 2015-05-08 11:45:08 · 554 阅读 · 0 评论 -
C语言 条件编译详解
指令 用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编译下面代码 #ifdef转载 2015-05-08 18:32:11 · 550 阅读 · 0 评论 -
数组指针与指针数组的区别
C/C++中有两个非常容易混淆的十分常用的但是又特别不引起人注意的两个概念,指针数组和数组指针,或许你已经对这两个概念早有耳闻,但是不知你有没有对他们做过细致的分析来区别二者呢?下面我们来看下百度百科上是如何对二者进行定义的。 数组指针(也称行指针) 数组指针:数组名本身就是一个指针,指向数组的首地址。注意这是声明定长数组时,其数组名指向的数组首地址是常量。而声明数组并原创 2014-02-22 11:53:39 · 1225 阅读 · 0 评论 -
Xmodem源代码
1、Xmodem源代码#include "crc16.h"#define SOH 0x01#define STX 0x02#define EOT 0x04#define ACK 0x06#define NAK 0x15#define CAN 0x18#define CTRLZ 0x1A#define DLY_1S 1000#define MAXRETR转载 2015-05-18 15:20:06 · 6677 阅读 · 0 评论 -
C语言的负数扩充
开发过程中遇到负数short强制转换为int出错,遂细细琢磨了一下1,C语言移位操作正数左移,右侧补充零。正数右移,左侧补充零。负数左移,右侧补充零。负数右移,左侧补充符号位1。2,C语言类型转换提权正数unsigned shrot的0xABCD,转换为unsigned int型,结果是0x0000ABCD。负数short的0xABCD,转换为int型,结果原创 2015-11-25 17:15:28 · 1119 阅读 · 0 评论 -
float与double的范围和精度
float与double的范围和精度1 范围float和double的范围是由指数的位数来决定的。float的指数位有8位,而double的指数位有11位,分布如下:float:1bit(符号位)8bits(指数位)23bits(尾数位)double:1bit(符号位)11bits(指数转载 2014-05-12 23:20:13 · 1362 阅读 · 0 评论 -
自动类型提升
面试过java程序员的或多或少对这个题目有点面熟:short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?答案是:前者错,后者对。why? 且看下面分解:java类型计算中,除了强制类型转换,还有各不很面熟的自动类型提升java在表达式中,对中间值的精确要求有时可能会超过任何一个操作数的范围。例如,考虑下面的表达式转载 2014-04-01 18:58:19 · 1517 阅读 · 0 评论 -
float浮点数的二进制存储方式及转换
int和float都是4字节32位表示形式。为什么float的范围大于int?float精度为6~7位。1.66*10^10的数字结果并不是166 0000 0000 指数越大,误差越大。这些问题,都是浮点数的存储方式造成的。 float和double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R6转载 2014-03-07 11:04:01 · 1189 阅读 · 0 评论 -
c语言malloc和free
在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的malloc()和free()两个函数的了解甚少,只知道大概该怎么用—— 就是malloc然后free就一切OK了。当然现在对这两个函数的体会也不见得多,不过对于本文章第三部分的内容倒是有了转折性的认识,所以写下这篇文章作为一个对知识的总结。这篇文章之所以命名中有个“浅谈”的字眼,也就是这个意思了!希望对大家有一点帮助!转载 2013-11-19 23:55:05 · 1114 阅读 · 0 评论 -
C语言字节对齐
文章最后本人做了一幅图,一看就明白了,这个问题网上讲的不少,但是都没有把问题说透。 一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访问数转载 2013-11-25 18:25:35 · 795 阅读 · 0 评论 -
字节对齐与结构体大小
说明:结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对sizeof我们将在另一篇文章中总结,这篇文章我们只总结结构体的sizeof,报着不到黄河心不死的决心,终于完成了总结,也算是小有收获,拿出来于大家分享,如果有什么错误或者没有理解透的地方还望能得到提点,也不转载 2013-11-26 13:55:54 · 934 阅读 · 0 评论 -
结构体大小的计算(无说明的默认32位机)
关于结构体内存对齐 内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了。 一、内存对齐的原因 大部分的参考资料都是如是说的: 1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能原创 2013-11-26 15:46:51 · 3952 阅读 · 1 评论 -
堆和栈的区别(转过无数次的文章)
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两转载 2013-11-19 21:35:29 · 735 阅读 · 0 评论 -
C语言中以十六进制输出字符型变量会出现'ffffff"的问题
最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下:C代码 char buf[10] = {0}; buf[0] = 0xbf; printf("%2x\n\n\n", buf[0]); /*在终端将会显示成:fff转载 2013-11-29 16:47:17 · 3656 阅读 · 2 评论 -
C语言变量名和地址的关系探讨
变量名不占空间变量:用来标识(identify)一块内存区域,这块区域的值一般是可以更改的,这就是它“变”的由来,但是我们可以通过使用如const等一些修饰符号来限定这一内存区域的操作特性(characteristic),即变量的操作特性。用const修饰的使变量不能更改的就和常量一样的变量叫做常变量。变量名:是一个标识符(identifier),用来指代一块内存区域,即变量,使用变量转载 2013-11-29 16:56:52 · 851 阅读 · 0 评论 -
C语言运算符优先级(超详细)和口诀
C语言运算符优先级和口诀一共有十五个优先级: 1 () [] . ->2 ! ~ -(负号) ++ -- &(取变量地址)* (type)(强制类型) sizeof 3 * / %4 + - 5 >> 6 > >= 7 == != 8 & 9 ^ 10 |转载 2013-11-30 14:21:34 · 1431 阅读 · 0 评论 -
C语言字节对齐问题
Ubuntu版本32位linux@xubuntu:~$ uname -arLinux xubuntu 3.5.0-40-generic #62~precise1-Ubuntu SMP Fri Aug 23 17:59:10 UTC 2013 i686 i686 i386 GNU/LinuxC源代码#include int main(){ int a原创 2013-11-30 12:11:00 · 755 阅读 · 0 评论 -
C语言字节对齐及__attribute__((aligned(n))) 与 #pragma(pack(n))的作用
C语言字节对齐及__attribute__((aligned(n))) 与 #pragma(pack(n))的作用原创 2015-11-25 09:32:31 · 3262 阅读 · 0 评论