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

[复制链接]
5703|40
 楼主| 江陵龙少 发表于 2017-4-7 14:56 来自手机 | 显示全部楼层 |阅读模式
arm开发下,
unsigned char  ss = 3 ;
unsigned int data = 0 ;

执行下面的语句:
data = ~ss ;

请问 data最后的值是多少?
feelhyq 发表于 2017-4-7 16:08 | 显示全部楼层
楼主不好意思,作为C语言的低手我向来凑个热闹。 unsigned char 类型和unsigned int类型进行运算,首先会将小的转成大的 即 unsigned char转成unsigned int再参与运算,谭浩强的《C语言程序设计》有这一段话。
woshixinshou 发表于 2017-4-7 18:16 | 显示全部楼层
楼上分析到位~
 楼主| 江陵龙少 发表于 2017-4-7 18:38 来自手机 | 显示全部楼层
feelhyq 发表于 2017-4-7 16:08
楼主不好意思,作为C语言的低手我向来凑个热闹。 unsigned char 类型和unsigned int类型进行运算,首先会将 ...

那么,层主的答案是0xFC吗?
 楼主| 江陵龙少 发表于 2017-4-7 18:47 来自手机 | 显示全部楼层
本帖最后由 江陵龙少 于 2017-4-7 19:18 编辑

我来解答,ss按位取反后,为0XFC,然后扩展成32位位宽,再赋值给data,那么答案就是0X0000 00FC。是这样吗?
 楼主| 江陵龙少 发表于 2017-4-7 18:48 来自手机 | 显示全部楼层
本帖最后由 江陵龙少 于 2017-4-7 19:18 编辑

我来解答,ss按位取反后,0XFC,然后扩展成32位位宽,再赋值给data,那么答案就是0X0000 00FC。是这样吗?

评论

是16位吧,INT类型。  发表于 2017-4-7 19:27
正解。  发表于 2017-4-7 19:25
zyj9490 发表于 2017-4-7 19:23 | 显示全部楼层
zyj9490 发表于 2017-4-7 19:25 | 显示全部楼层
本帖最后由 zyj9490 于 2017-4-7 19:26 编辑
feelhyq 发表于 2017-4-7 16:08
楼主不好意思,作为C语言的低手我向来凑个热闹。 unsigned char 类型和unsigned int类型进行运算,首先会将 ...

左边的类型与右边运算无关。运算好后再付值而已。
zyj9490 发表于 2017-4-7 19:29 | 显示全部楼层
feelhyq 发表于 2017-4-7 16:08
楼主不好意思,作为C语言的低手我向来凑个热闹。 unsigned char 类型和unsigned int类型进行运算,首先会将 ...

明显是错的。是他错,还是理解错。指的是同一边运算。
zyj9490 发表于 2017-4-7 19:30 | 显示全部楼层
feelhyq 发表于 2017-4-7 16:08
楼主不好意思,作为C语言的低手我向来凑个热闹。 unsigned char 类型和unsigned int类型进行运算,首先会将 ...

根据你的理解应为0Xfffc.
mo_chen 发表于 2017-4-7 20:00 | 显示全部楼层
unsigned char 为8为,usigned int 为16位,先计算等号右边的取反,之后为了保证数据不丢失,等号右边的将转换成unsigned int再进行赋值运算
zhaoliang3057 发表于 2017-4-7 20:43 | 显示全部楼层
我也一样。。。。
taoest 发表于 2017-4-7 21:59 | 显示全部楼层
不要写这种你也不确定的程序。
xxzouzhichao 发表于 2017-4-7 22:53 来自手机 | 显示全部楼层
整型提升,fffffffc
icecut 发表于 2017-4-8 00:12 | 显示全部楼层
1.无符号数.这个是重点
2. 3->~3=0xfc->int = 0x00fc
如果是有符号数,就不是这样了
ddllxxrr 发表于 2017-4-8 06:45 | 显示全部楼层
crazyren 发表于 2017-4-8 08:13 | 显示全部楼层
我觉得啊,折腾这种隐晦的语法没多少意义,说不定结果跟编译器还有关系。代码应该简单易懂,无歧义
jiemnij 发表于 2017-4-8 08:58 | 显示全部楼层
毫无疑问0xFFFF FFFC
 楼主| 江陵龙少 发表于 2017-4-8 09:06 来自手机 | 显示全部楼层
本帖最后由 江陵龙少 于 2017-4-8 09:11 编辑

好了,现在公布问题的来源和正确的结果,14楼的大神一言而决,说出了正确的结果。对于整形提升,还是有点迷糊。问题的来源,在system_stm32f10x.c文件中有个函数SetSysClockTo72(),其中有条语句FLASH->ACR &= (uint32_t) ((uint32_t) ~FLASH_ACR_LATENCY);其中,FLASH_ACR_LATENCY就是一个8位无符号整形型常量,这句代码引起了我的疑惑,进而有了上面的测试,对于那些开口则言不要这样写歧义的代码,我觉得很不负责任。
Xy201207 发表于 2017-4-8 09:10 | 显示全部楼层
自己分析 然后根据实践不就好了,分析与实践结果不同再问吧.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

286

帖子

2

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