OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4143|回复: 13

C语言基础

[复制链接]

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2015-11-3
在线时间
22 小时
发表于 2016-3-9 21:09:30 | 显示全部楼层 |阅读模式
u8 是 unsigned char      8位
u16 是 unsigned short   16位
u32 是 unsigned int        32位
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-9 22:30:48 | 显示全部楼层
TinyBoy 发表于 2016-3-9 21:55
编译器都不知道你机器的字宽还叫编译器?你要么搞明白这个问题,要么定义和平台无关的数据类型。

获取平台的字宽当然轻而易举,
我的意思是对于unsigned int究竟该是多少位由编译器确定(可通过sizeof(unsigned int)获取到。),编译器确定长度时参照的是平台的字宽是编译器自己的事,没人说非得如此。
(要不然在我电脑上运行的世界上任意一款编译器的unsigned int长度都一样?)

我认为根本就没办法定义和平台无关的数据类型(要不然为啥ARM不直接用int、long?),
正因如此,ARM才采用uint8_t、uint16_t、uint32_t等新数据类型,
把这些字宽的问题交给自己解决,即统一了数据类型又简化了程序员的难度,
当编译器改变位宽后,ARM只需更新一下CMSIS中关于uint8_t的typedef即可做到一改全改。
完全不需要程序员考虑这些问题。
坚决不用寄存器,拒绝重复造轮子。
回复 支持 1 反对 0

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1837
金钱
1837
注册时间
2014-6-27
在线时间
981 小时
发表于 2016-3-9 21:38:57 | 显示全部楼层
unsigned int占内存大小就是你的机器的字宽,16位或者32位,不由你决定。
回复 支持 反对

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-9 21:43:39 | 显示全部楼层
TinyBoy 发表于 2016-3-9 21:38
unsigned int占内存大小就是你的机器的字宽,16位或者32位,不由你决定。

否定,C语言标准没有规定unsigned int究竟多少位,只给了范围值,
具体怎么实现由编译器决定,跟机器什么的没啥关系
坚决不用寄存器,拒绝重复造轮子。
回复 支持 反对

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1837
金钱
1837
注册时间
2014-6-27
在线时间
981 小时
发表于 2016-3-9 21:55:32 | 显示全部楼层
xkwy 发表于 2016-3-9 21:43
否定,C语言标准没有规定unsigned int究竟多少位,只给了范围值,
具体怎么实现由编译器决定,跟机器什 ...

编译器都不知道你机器的字宽还叫编译器?你要么搞明白这个问题,要么定义和平台无关的数据类型。
回复 支持 反对

使用道具 举报

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2015-11-3
在线时间
22 小时
 楼主| 发表于 2016-3-9 22:50:24 | 显示全部楼层
xkwy 发表于 2016-3-9 22:30
获取平台的字宽当然轻而易举,
我的意思是对于unsigned int究竟该是多少位由编译器确定(可通过sizeof(u ...

那么这些数据类型的准确意思是?
回复 支持 反对

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1837
金钱
1837
注册时间
2014-6-27
在线时间
981 小时
发表于 2016-3-9 22:51:32 | 显示全部楼层
xkwy 发表于 2016-3-9 22:30
获取平台的字宽当然轻而易举,
我的意思是对于unsigned int究竟该是多少位由编译器确定(可通过sizeof(u ...

你自己那样定义数据类型就是为了考虑和平台无关,只是那个你定义没有考虑到机器字宽而已,在某些情况下不适用。(要不然在我电脑上运行的世界上任意一款编译器的unsigned int长度都一样?),此话貌似你都以为计算机为平台了?
回复 支持 反对

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-10 08:56:26 | 显示全部楼层
TinyBoy 发表于 2016-3-9 22:51
你自己那样定义数据类型就是为了考虑和平台无关,只是那个你定义没有考虑到机器字宽而已,在某些情况下不 ...

额,我没那本事定义,只会用,我用的是ARM定义的(在stdint.h里),
我没考虑到机器字宽,但我相信ARM会考虑的。

我举一个极端的例子你怎能以偏概全?为了辩论而辩论?

此外,按照你的意思来说对于51单片机int就是8位喽?
非也,我依然坚持,位宽由编译器决定,keil编译完毕后直接变成汇编指令,
根本没有这么多纠结,51处理一个keil编译出来的unsigned int(32bit)至多需要动用4个寄存器,
坚决不用寄存器,拒绝重复造轮子。
回复 支持 反对

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-10 09:01:25 | 显示全部楼层
微信扫一扫 发表于 2016-3-9 22:50
那么这些数据类型的准确意思是?

这个数据类型由ST公司定义并维护,你使用它就能明确地知道这个变量是多少位的,
对于32-bit的STM32单片机,使用u32效率最高。


PS:这种类型已经被淘汰,是过时的,现在依然可以用,是ST为了兼容老旧的代码。
建议改用ARM的新标准,使用uint8_t、uint16_t、uint32_t等,
并且ST已经全线转到该标准下。
l.png





------不正经的分割线-----

z (24).jpg
坚决不用寄存器,拒绝重复造轮子。
回复 支持 反对

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1837
金钱
1837
注册时间
2014-6-27
在线时间
981 小时
发表于 2016-3-10 09:29:12 | 显示全部楼层
xkwy 发表于 2016-3-10 08:56
额,我没那本事定义,只会用,我用的是ARM定义的(在stdint.h里),
我没考虑到机器字宽,但我相信ARM会 ...

有点意思,不过int 怎么定论,都不会小于16位,”按照你的意思来说对于51单片机int就是8位喽?“,此话也不代表编译器和机器字宽有矛盾。
回复 支持 反对

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-10 09:51:09 | 显示全部楼层
TinyBoy 发表于 2016-3-10 09:29
有点意思,不过int 怎么定论,都不会小于16位,”按照你的意思来说对于51单片机int就是8位喽?“,此话也 ...

同意前半部分。
坚决不用寄存器,拒绝重复造轮子。
回复 支持 反对

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1837
金钱
1837
注册时间
2014-6-27
在线时间
981 小时
发表于 2016-3-10 09:57:04 | 显示全部楼层
xkwy 发表于 2016-3-10 09:51
同意前半部分。

这么说吧,抛开编译器和机器字宽,“u32 是 unsigned int        32位”此话是不是考虑不够全面,有些的单片机实际就是16位,他定义u32,使用就有风险了。
回复 支持 反对

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-10 09:59:22 | 显示全部楼层
TinyBoy 发表于 2016-3-10 09:57
这么说吧,抛开编译器和机器字宽,“u32 是 unsigned int        32位”此话是不是考虑不够全面,有些的 ...

是的,在51里使用unsigned int 巨慢,
坚决不用寄存器,拒绝重复造轮子。
回复 支持 反对

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1837
金钱
1837
注册时间
2014-6-27
在线时间
981 小时
发表于 2016-3-10 10:08:57 | 显示全部楼层
xkwy 发表于 2016-3-10 09:59
是的,在51里使用unsigned int 巨慢,

该用还得用,重要的是用得明白。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 06:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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