打印
[开发工具]

c语言的问题请教

[复制链接]
807|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
江陵龙少|  楼主 | 2018-11-22 22:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
近来又有个问题想不通,或者说知识不系统,请教大家,有函数:
uint32  Systick_Config (uint32  ticks )
{
    if ( (ticks-1UL) >0xFFFFFFUL)
    {
       return 1UL;
    }
    return  0UL;
}

疑问,当ticks的值为0时,函数返回值是多少?即 (ticks -1) 此时是以 -1来看呢?还是以0xFFFFFFFF来看呢?
虽然可以马上去验证去实验,回答出上面的结果。但这其中的类型转换规律是什么?有什么规则支持?
假设上面的表达式中0xFFFFFFUL不加UL呢?又如何呢?
沙发
mohanwei| | 2018-11-23 08:12 | 只看该作者
你再数数有多少个FF
if ( (ticks-1UL) >0xFFFFFFUL)

另外UL意思是这个数是无符号长整型

使用特权

评论回复
板凳
laujc| | 2018-11-23 11:55 | 只看该作者
已经指明是uint32 即无符号数,所以ticks-1UL仍然是正常,不存在-1情况。

0xFFFFFFFF不加UL应该也是无符号数,因为前面是无符号数。

建议不要让编译器自动转换数据类型,还是写程序时指明比较好。

编译器转换时,一般是往更大范围转,不损失数据内容为原则。

使用特权

评论回复
地板
huzi2099| | 2018-11-23 16:07 | 只看该作者
0xFFFFFF是个啥概念,没交代明白
0~0xffffff都返回1

使用特权

评论回复
5
gavinpeng2| | 2018-11-24 18:02 | 只看该作者
C里面有一个默认的规则集合来自动完成类型转换。其中有两条转换规则如下:
1.在包含两种数据类型的任何运算里,两个值都被转换成两种类型里面的较高级别。
2.类型级别从高到低的顺序是long double, double, float, unsigned long long, long long, long, unsigned int 和 int.

所以你的例子的运算默认都会转为32位无符号运算。无符号就是没有负数了,0 - 1 = 0xFFFFFFFF
计算机里面有一个基础概念就是只有0和1. 内在里面存放着32个1, 你上层是有符号的类型就显示-1,无符号类型就显示0xFFFFFFFF

使用特权

评论回复
6
xuanhuanzi| | 2018-11-24 21:14 | 只看该作者
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)

{

// 不可能的重装载值,超出范围

if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) {

  return (1UL);

  }

使用特权

评论回复
7
antusheng| | 2018-11-24 21:52 | 只看该作者
那是6*4BIT,24BIT啊,跟32BIT玩。

使用特权

评论回复
8
643757107| | 2018-11-25 22:57 | 只看该作者
可以读出来这个数,用二进制打印看看。

使用特权

评论回复
9
江陵龙少|  楼主 | 2018-11-26 10:43 | 只看该作者
xuanhuanzi 发表于 2018-11-24 21:14
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)

{

是的,这位兄弟找到了该函数的出去

使用特权

评论回复
10
stm32jy| | 2018-11-26 11:21 | 只看该作者
0xFFFFFF 32位的systick 吧减到0重新开始,以此循环

使用特权

评论回复
11
stm32jy| | 2018-11-26 11:23 | 只看该作者
多看看原子哥的视频

使用特权

评论回复
12
stm32jy| | 2018-11-26 11:23 | 只看该作者
零死角玩转stm32 值得推荐

使用特权

评论回复
13
kingkits| | 2018-11-26 15:55 | 只看该作者
系统SYSTick 是个24位计数器,所以初始化时,不允许超过0xFFFFFF, 返回1 表示数值大了,超出计数器范围

使用特权

评论回复
14
观海| | 2018-11-27 12:55 | 只看该作者
定义成无符号的话应该没有-1啊

使用特权

评论回复
15
磨砂| | 2018-12-1 18:02 | 只看该作者
数据类型不匹配?

使用特权

评论回复
16
晓伍| | 2018-12-1 19:05 | 只看该作者
都是无符号的话应该没有啥问题的

使用特权

评论回复
17
观海| | 2018-12-3 13:28 | 只看该作者
以0xfffffff来看 呵呵呵

使用特权

评论回复
18
guanjiaer| | 2018-12-3 13:31 | 只看该作者
既然是无符号的 那么就绝对不会出现负值

使用特权

评论回复
19
wowu| | 2018-12-3 14:37 | 只看该作者
0xFFFFFF 因该是这个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

279

帖子

2

粉丝