在 Keil MDK 开发环境中,经常会遇到类似于unsigned int 8、uint8_t 、u8等数据变量定义,对于初学者来讲确实是有点痛苦,后来查询发现以上三种方式均表示——无符号的8位整形数据。
由于C语言类型的长度完全由编译器决定,char 通常被定义成 8 位宽;int 通常被定义成 16 位或 32 位宽(或更高),它取决于平台(编译器将在这两者间选择最合适的字宽);short 通常被定义成 16 位宽;long 通常被定义成 32 或 64位宽。
所以 C99 中引进了一个标准C库头文件 stdint.h ,方便精确确定整数类型的宽度
定义标准的扩展整数类型_stdint.h文件(部分)
/* Signed. */
/* There is some amount of overlap with #ifndef __int8_t_defined # define __int8_t_defined typedef signed char int8_t; //标准表达方式 signed char 被等同于 int8_t; typedef short int int16_t; typedef int int32_t; # if __WORDSIZE == 64 typedef long int int64_t; # else __extension__ typedef long long int int64_t; # endif #endif /***************************************/ /* Unsigned. */ typedef unsigned char uint8_t; typedef unsigned short int uint16_t; #ifndef __uint32_t_defined typedef unsigned int uint32_t; # define __uint32_t_defined #endif #if __WORDSIZE == 64 typedef unsigned long int uint64_t; #else __extension__ typedef unsigned long long int uint64_t; #endif /***************************************/ /* Small types. */ /* Signed. */ typedef signed char int_least8_t; typedef short int int_least16_t; typedef int int_least32_t; #if __WORDSIZE == 64 typedef long int int_least64_t; #else __extension__ typedef long long int int_least64_t; #endif /***************************************/ /* Unsigned. */ typedef unsigned char uint_least8_t; typedef unsigned short int uint_least16_t; typedef unsigned int uint_least32_t; #if __WORDSIZE == 64 typedef unsigned long int uint_least64_t; #else __extension__ typedef unsigned long long int uint_least64_t; #endif /***************************************/ /* Fast types. */ /* Signed. */ typedef signed char int_fast8_t; #if __WORDSIZE == 64 typedef long int int_fast16_t; typedef long int int_fast32_t; typedef long int int_fast64_t; #else typedef int int_fast16_t; typedef int int_fast32_t; __extension__ typedef long long int int_fast64_t; #endif /***************************************/ /* Unsigned. */ typedef unsigned char uint_fast8_t; #if __WORDSIZE == 64 typedef unsigned long int uint_fast16_t; typedef unsigned long int uint_fast32_t; typedef unsigned long int uint_fast64_t; #else typedef unsigned int uint_fast16_t; typedef unsigned int uint_fast32_t; __extension__ typedef unsigned long long int uint_fast64_t; #endif /***************************************/ /* Types for `void *' pointers. */ #if __WORDSIZE == 64 # ifndef __intptr_t_defined typedef long int intptr_t; # define __intptr_t_defined # endif typedef unsigned long int uintptr_t; #else # ifndef __intptr_t_defined typedef int intptr_t; # define __intptr_t_defined # endif typedef unsigned int uintptr_t; #endif /***************************************/ /* Largest integral types. */ #if __WORDSIZE == 64 typedef long int intmax_t; typedef unsigned long int uintmax_t; #else __extension__ typedef long long int intmax_t; __extension__ typedef unsigned long long int uintmax_t; #endif *_t结尾的类型,可以理解为type/typedef的缩写,就是一个结构标注,表示是通过typedef定义的,而不是其它数据类型。(程序的可扩展性) 无符号类型 可表示 unsigned char u8 unsigned short u16 unsigned int u32 这样定义的好处在于使用时不会感觉太混乱,从而能有效的维护代码。 类 型 说 明 typedef 准确长度类型 intN_t(N为类型宽度) 最小长度类型 int_leastN_t 快速长度类型 int_fastN_t 指针长度类型 intptr_t 最大长度类型 intmax_t 类型说明 int_least16_t : 指获得一个当前平台所支持的至少有 16 位宽的最短整数类型。 int_fast32_t : 指获得当前平台下需要处理速度最快的至少为 32 位的整数类型。 intmax_t : 指获得当前平台所支持的最大宽度的整数类型。 intptr_t (无符号uintptr_t): 为安全跨平台编程的保证,对于写跨 64 位平台的程序非常重要,是指针和整数之间的转换经常用到(多用于需要精确控制数据在内存中的精确布局时)。换句话说,当需要把指针作为一个整数来运算时,转换成intptr_t才是安全的,然后在运算完毕后再安全的转回指针类型。 无符号整形对应的*_t类型 字 宽 uint8_t 1字节 uint16_t 2字节 uint32_t 4字节 uint64_t 16字节 int64_t uint64_t 大数输出 格式 int64_t %lld uint64_t %llu uint64_t %llx(十六进制) uint64_t %llo (八进制) volatile 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。 俗称禁止程序优化,一般在进行多线程程序设计时加,就是在有中断的程序中常见,并且是中断程序所用变量一般用这个加以修饰。 简单的说,就是不让编译器进行优化,即每次读取或者修改值的时候,都必须重新从内存或者寄存器中读取或者修改。 volatile一般用在以下三个方面: 中断标志位 多线程共享的变量 状态寄存器 const 是一个C语言的关键字,它限定一个变量不允许被改变 只读变量,即变量保存在只读静态存储区。编译时,如何尝试修改只读变量,则编译器提示出错,就能防止误修改。 const与define 两者都可以用来定义常量,但是const定义时,定义了常量的类型,所以更精确一些(其实const定义的是只读变量,而不是常量)。 #define只是简单的文本替换,除了可以定义常量外,还可以用来定义一些简单的函数,有点类似内置函数。 const和define定义的常量可以放在头文件里面。(小注:可以多次声明,但只能定义一次) const与指针 int flag; const int * p1=&flag; //p1可变,*p1不可变 const 修饰的是 *p1,即*p1不可变 int * const p2=&flag; //p2不可变,*p2可变 const 修饰的是 p2,即p2不可变 const int *const p3=&flag; //p3不可变,*p3也不可变 前一个const 修饰的是 *p3,后一个const 修饰的是p3,两者都不可变
上一篇:stm32f4xx 加密
下一篇:STM32中常用的数据类型
推荐阅读
史海拾趣
正学习cortex-m3,对其有一定了解,学过s3c2440对嵌入式较熟悉,希望也能在cortex-m3上也有一定的成绩,本人向来本着分享精神,在csdn上传有我的许多学习2440的心得… 查看全部问答∨ |
如图我用单片机和此芯片连接作了个充电器。,CT和RESTRT之间的电容,是100nf,根据数据手册的公式其充电时间是最多3小时,但是我接上电池1小时后,LED就开始闪烁了。手册给出了四种情况,我的就属于第四种:LED开始频闪,电压小于2.5V(就是没达到4.5 ...… 查看全部问答∨ |
使用VS2005编译TCPMP 0.72RC1出错。 安装了CE6.0的SDK. 设置如下: Properties->C/C++->Advanced->Compile For Architecture->ARM4(/QRarch4) Properties->Linker->Advanced->Targer Machine->MachineTHUMB 首先编译的的commo ...… 查看全部问答∨ |
由于我师姐用的是Linux操作系统,ARM开发板上装的是Linux内核。我用的是WinCE操作系统,我要把WinCE内核映像移植到开发板上,我们用的是同一个开发板。请敬高人:我该怎么做?是不是把内核映像移植到开发板后,才能导出目标平台的SDK?谢谢!… 查看全部问答∨ |
最近正在学习LM3s5749中的AD,已经看完英文版的介绍资料,只有EasyArm5749中的一个例子,感觉太少了点。 请求各位大虾,有学过的5000系列的,给小弟推荐个网站能下载几个例子研究的,或是发给我些例子能学习下。 我的邮箱12480541@qq.com 不胜感 ...… 查看全部问答∨ |
|
以前有过开发板的试用活动,试用的版友们写出了很多优秀的试用笔记,给430的新手们留下了宝贵的学习资料。咱们MSP430版会持续的开展一些活动,来给学习以及使用MSP430的朋友们更多熟悉它的机会。大家有没有啥想法,咱们一起来把它实现。曾经的想法 ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 新突破!超高速内存,为英特尔至强6性能核处理器加速
- 将vRAN站点整合至单服务器,助力运营商降低总体拥有成本
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?