发新帖我要提问
12
返回列表
打印
[uCOS/RTOS]

c语言的高手请进

[复制链接]
楼主: 江陵龙少
手机看帖
扫描二维码
随时随地手机跟帖
21
江陵龙少|  楼主 | 2017-4-8 09:13 | 只看该作者 回帖奖励 |倒序浏览
Xy201207 发表于 2017-4-8 09:10
自己分析 然后根据实践不就好了,分析与实践结果不同再问吧.

的确,我的分析与实践结果不同,所以,问了。

使用特权

评论回复
22
江陵龙少|  楼主 | 2017-4-8 09:17 | 只看该作者
xxzouzhichao 发表于 2017-4-7 22:53
整型提升,fffffffc

这里的答案是正确的

使用特权

评论回复
23
江陵龙少|  楼主 | 2017-4-8 09:19 | 只看该作者
jiemnij 发表于 2017-4-8 08:58
毫无疑问0xFFFF FFFC

正确

使用特权

评论回复
24
江陵龙少|  楼主 | 2017-4-8 09:28 | 只看该作者
江陵龙少 发表于 2017-4-8 09:06
好了,现在公布问题的来源和正确的结果,14楼的大神一言而决,说出了正确的结果。对于整形提升,还是有点迷 ...

stm32的初学者,大家一定要好好钻研,不要回避问题,不要掩盖问题,业精于勤,业精与细。

使用特权

评论回复
25
pkuzhx| | 2017-4-8 09:29 | 只看该作者
这种问题难道不是自己想一想,然后开编译器实践一下就知道了吗?

使用特权

评论回复
26
fengrenjie| | 2017-4-8 10:17 | 只看该作者
经过实践 如果是2字节的 应该是 0xFFFC;
如果是4字节的,应该是0xFFFFFFFC;
到底是2还是4,编译器的不同吧。

使用特权

评论回复
27
@若水| | 2017-4-8 12:55 | 只看该作者
一切以程序的运行结果为准,扯这些问题没什么用的

使用特权

评论回复
28
le062| | 2017-4-8 13:32 | 只看该作者
江陵龙少 发表于 2017-4-8 09:06
好了,现在公布问题的来源和正确的结果,14楼的大神一言而决,说出了正确的结果。对于整形提升,还是有点迷 ...

呵呵
好想法,可以装两下B

使用特权

评论回复
29
le062| | 2017-4-8 13:33 | 只看该作者
@若水 发表于 2017-4-8 12:55
一切以程序的运行结果为准,扯这些问题没什么用的

程序运行结果体现是编译器作者的意志,并不是什么物理学规律。没什么好膜拜的

使用特权

评论回复
30
@若水| | 2017-4-8 13:41 | 只看该作者
le062 发表于 2017-4-8 13:33
程序运行结果体现是编译器作者的意志,并不是什么物理学规律。没什么好膜拜的 ...

与编译器有关,在这里讨论,意义就不大了

使用特权

评论回复
31
crazyren| | 2017-4-8 14:03 | 只看该作者
用vs2013试了下:
int _tmain(int argc, _TCHAR* argv[])
{
        unsigned char  ss = 3;
        unsigned int data1 = 0;
        unsigned int data2 = 0;
        unsigned char  ss2;
        ss2 = ~ss;
        data1 = ss2;
        data2 = ~ss;
        printf("data1 = 0x%x; data2=0x%x\n", data1,data2);
        getchar();

        return 0;
}

结果:
data1 = 0xfc; data2=0xfffffffc

使用特权

评论回复
32
江陵龙少|  楼主 | 2017-4-8 23:06 | 只看该作者
这篇帖子可以结贴了,上面的水贴比较多,无视它。但的确有高手指出了答案的线索,就是 整型提升,请有兴趣的百度搜索 整型提升,有帖子讲得很好,获益良多。

使用特权

评论回复
33
江陵龙少|  楼主 | 2017-4-8 23:13 | 只看该作者
感谢14楼的大神xxzouzhichao

使用特权

评论回复
34
srhaoqi| | 2017-4-13 17:48 | 只看该作者
这个也要看是多少位的系统吧,16位和32位的答案不一样把

使用特权

评论回复
35
胡慧海| | 2017-4-14 09:55 | 只看该作者
江陵龙少 发表于 2017-4-8 09:06
好了,现在公布问题的来源和正确的结果,14楼的大神一言而决,说出了正确的结果。对于整形提升,还是有点迷 ...

(uint32_t) ((uint32_t)两个这个有什么深意吗

使用特权

评论回复
36
zzjj44| | 2017-8-15 14:22 | 只看该作者
江陵龙少 发表于 2017-4-8 09:06
好了,现在公布问题的来源和正确的结果,14楼的大神一言而决,说出了正确的结果。对于整形提升,还是有点迷 ...

楼猪,你确定你的语句和stm32头文件的语句一样吗?
unsigned char  ss = 3 ;
unsigned int data = 0 ;
data = ~ss ;
你这个是整形提升!
FLASH->ACR &= (uint32_t) ((uint32_t) ~FLASH_ACR_LATENCY);
人家这个是强制转换!根据优先级,先把FLASH_ACR_LATENCY转换为32位,最后在取反,最后在转化为32位。
按你讲的都是整形提升的话,那这个语句:
int d = -1;
if (d <= (int)(sizeof(arr)/sizeof(arr[0])))
   ;
又有什么意义呢!

使用特权

评论回复
37
lenglx| | 2017-9-12 17:44 | 只看该作者
按C语音标准解释啊.
见ISO-IEC9899  6.3.1

If an int can represent all values of the original type, the value is converted to an int;
otherwise, it is converted to an unsigned int. These are called the integer
promotions.48)

48) The integer promotions are applied only: as part of the usual arithmetic conversions, to certain
argument expressions, to the operands of the unary +, -, and ~ operators, and to both operands of the
shift operators, as specified by their respective subclauses.

你这个语句实际上包括'整型提升'和'整型转换'2个操作.
data=~ss;
~适用整型提升, ss提升到int类型, 之后取反, 为0XFFFFFFFC.
之后, int类型转换成unsigned int类型.最后结果是0XFFFFFFFC.

使用特权

评论回复
38
mo_chen| | 2018-11-18 10:24 | 只看该作者
ss按位取反后,为0XFC,然后扩展成32位位宽(部分为64位),再赋值给data,那么答案就是0X0000 00FC

使用特权

评论回复
39
江陵龙少|  楼主 | 2018-11-22 21:40 | 只看该作者
本帖最后由 江陵龙少 于 2018-11-22 22:01 编辑

想不到这个帖子这么久了又被翻出来了,本人知识浅陋,当时有点**血了。让大家见笑了!惭愧!
恰好,近来又有个问题想不通,或者说知识不系统,请教大家,有函数:
uint32  Systick_Config (uint32  ticks )
{
    if ( (ticks-1UL) >0xFFFFFFUL)
    {
       return 1UL;
    }
    return  0UL;
}

疑问,当ticks的值为0时,函数返回值是多少?即 (ticks -1) 此时是以 -1来看呢?还是以0xFFFFFFFF来看呢?
虽然可以马上去验证去实验,回答出上面的结果。但这其中的类型转换规律是什么?有什么规则支持?
假设上面的表达式中0xFFFFFFUL不加UL呢?又如何呢?

使用特权

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

本版积分规则