[uCOS/RTOS] c语言的高手请进

[复制链接]
5706|40
 楼主| 江陵龙少 发表于 2017-4-8 09:13 来自手机 | 显示全部楼层
Xy201207 发表于 2017-4-8 09:10
自己分析 然后根据实践不就好了,分析与实践结果不同再问吧.

的确,我的分析与实践结果不同,所以,问了。
 楼主| 江陵龙少 发表于 2017-4-8 09:17 来自手机 | 显示全部楼层
xxzouzhichao 发表于 2017-4-7 22:53
整型提升,fffffffc

这里的答案是正确的
 楼主| 江陵龙少 发表于 2017-4-8 09:19 来自手机 | 显示全部楼层
jiemnij 发表于 2017-4-8 08:58
毫无疑问0xFFFF FFFC

正确
 楼主| 江陵龙少 发表于 2017-4-8 09:28 来自手机 | 显示全部楼层
江陵龙少 发表于 2017-4-8 09:06
好了,现在公布问题的来源和正确的结果,14楼的大神一言而决,说出了正确的结果。对于整形提升,还是有点迷 ...

stm32的初学者,大家一定要好好钻研,不要回避问题,不要掩盖问题,业精于勤,业精与细。
pkuzhx 发表于 2017-4-8 09:29 | 显示全部楼层
这种问题难道不是自己想一想,然后开编译器实践一下就知道了吗?
fengrenjie 发表于 2017-4-8 10:17 | 显示全部楼层
经过实践 如果是2字节的 应该是 0xFFFC;
如果是4字节的,应该是0xFFFFFFFC;
到底是2还是4,编译器的不同吧。
@若水 发表于 2017-4-8 12:55 | 显示全部楼层
一切以程序的运行结果为准,扯这些问题没什么用的
le062 发表于 2017-4-8 13:32 | 显示全部楼层
江陵龙少 发表于 2017-4-8 09:06
好了,现在公布问题的来源和正确的结果,14楼的大神一言而决,说出了正确的结果。对于整形提升,还是有点迷 ...

呵呵
好想法,可以装两下B
le062 发表于 2017-4-8 13:33 | 显示全部楼层
@若水 发表于 2017-4-8 12:55
一切以程序的运行结果为准,扯这些问题没什么用的

程序运行结果体现是编译器作者的意志,并不是什么物理学规律。没什么好膜拜的
@若水 发表于 2017-4-8 13:41 | 显示全部楼层
le062 发表于 2017-4-8 13:33
程序运行结果体现是编译器作者的意志,并不是什么物理学规律。没什么好膜拜的 ...

与编译器有关,在这里讨论,意义就不大了
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
 楼主| 江陵龙少 发表于 2017-4-8 23:06 来自手机 | 显示全部楼层
这篇帖子可以结贴了,上面的水贴比较多,无视它。但的确有高手指出了答案的线索,就是 整型提升,请有兴趣的百度搜索 整型提升,有帖子讲得很好,获益良多。
 楼主| 江陵龙少 发表于 2017-4-8 23:13 来自手机 | 显示全部楼层
感谢14楼的大神xxzouzhichao
srhaoqi 发表于 2017-4-13 17:48 | 显示全部楼层
这个也要看是多少位的系统吧,16位和32位的答案不一样把
胡慧海 发表于 2017-4-14 09:55 | 显示全部楼层
江陵龙少 发表于 2017-4-8 09:06
好了,现在公布问题的来源和正确的结果,14楼的大神一言而决,说出了正确的结果。对于整形提升,还是有点迷 ...

(uint32_t) ((uint32_t)两个这个有什么深意吗
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])))
   ;
又有什么意义呢!
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.

mo_chen 发表于 2018-11-18 10:24 | 显示全部楼层
ss按位取反后,为0XFC,然后扩展成32位位宽(部分为64位),再赋值给data,那么答案就是0X0000 00FC
 楼主| 江陵龙少 发表于 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呢?又如何呢?

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

本版积分规则

快速回复 在线客服 返回列表 返回顶部