[应用相关] c语言,数字后面加个u有什么好处? 不加行不行?

[复制链接]
23798|13
 楼主| bear1 发表于 2015-7-12 16:42 | 显示全部楼层 |阅读模式
#define  DEF_CLR                                           0u
#define  DEF_SET                                           1u

#define  DEF_FAIL                                          0u
#define  DEF_OK                                            1u


#define  DEF_BIT_00                                     0x01u
#define  DEF_BIT_01                                     0x02u
#define  DEF_BIT_02                                     0x04u
#define  DEF_BIT_03                                     0x08u
#define  DEF_BIT_04                                     0x10u
#define  DEF_BIT_05                                     0x20u
#define  DEF_BIT_06                                     0x40u
#define  DEF_BIT_07                                     0x80u

#define  DEF_BIT_56                       0x0100000000000000u
#define  DEF_BIT_57                       0x0200000000000000u
#define  DEF_BIT_58                       0x0400000000000000u
#define  DEF_BIT_59                       0x0800000000000000u
#define  DEF_BIT_60                       0x1000000000000000u
#define  DEF_BIT_61                       0x2000000000000000u
#define  DEF_BIT_62                       0x4000000000000000u
#define  DEF_BIT_63                       0x8000000000000000u


谢谢!
596142041 发表于 2015-7-12 18:10 | 显示全部楼层
其实没啥影响的。。。。
xyz549040622 发表于 2015-7-12 18:36 | 显示全部楼层
表明这些数字在MCU存储中所占的字节数,你不指定数据类型,MCU将会按照默认字节存储的。
zhaoyu2005 发表于 2015-7-12 18:38 | 显示全部楼层
596142041 发表于 2015-7-12 18:10
其实没啥影响的。。。。

等你遇到数据计算结果非想要(第一反应是计算结果错了,实际上不是错了)的时候就知道有没影响了。
戈卫东 发表于 2015-7-12 19:06 | 显示全部楼层
当数据类型向不同类型并且宽度也不同的方式转换时,可能有符号扩展行为,也可能没有。而符号扩展可能是你想要的也可能是你不想要的,这时候你对类型的选择需要注意。
不过,这些常数你指定类型是没有用的。。。。。。。
戈卫东 发表于 2015-7-12 19:10 | 显示全部楼层
或者说,现在常用的工具并不需要你这样在常数上附加类型
李富贵 发表于 2015-7-12 20:42 | 显示全部楼层
xyz549040622 发表于 2015-7-12 18:36
表明这些数字在MCU存储中所占的字节数,你不指定数据类型,MCU将会按照默认字节存储的。 ...

错,C语言里面0x8000000000000000u这样的常数一律默认为int型,不是什么字节。至于int型是4字节还是2字节那就是编译器的问题了。你加u尾缀并不会扩展常数占用的字节数,加ul才会从int型长度扩展成long型长度。

打赏榜单

xyz549040622 打赏了 1.00 元 2015-07-13

评分

参与人数 1威望 +10 收起 理由
xyz549040622 + 10

查看全部评分

lbc___ 发表于 2015-7-12 21:05 | 显示全部楼层
表示无符号数
309030106 发表于 2015-7-12 21:51 | 显示全部楼层
加u尾缀并不会扩展常数占用的字节数,加ul才会从int型长度扩展成long型长度
xyz549040622 发表于 2015-7-13 07:28 | 显示全部楼层
李富贵 发表于 2015-7-12 20:42
错,C语言里面0x8000000000000000u这样的常数一律默认为int型,不是什么字节。至于int型是4字节还是2字节 ...

谢谢老朴指点,纠正了我的一个误区。
icecut 发表于 2015-7-13 08:17 | 显示全部楼层
直到8楼才是重点
 楼主| bear1 发表于 2015-7-13 09:00 来自手机 | 显示全部楼层
IAR编译器环境下,有没有必要加这个u?
cool_coder 发表于 2015-7-13 13:01 | 显示全部楼层
bear1 发表于 2015-7-13 09:00
IAR编译器环境下,有没有必要加这个u?

只有在容易发生混淆的时候才是必要的,比如:0xffff 要赋给一个16位整型变量,如果是无符号整型,其值是十进制的65535;如果是有符号整型,却是-1。这时候明确指出来比较好。
ctsdswk 发表于 2015-7-13 16:51 | 显示全部楼层
后缀就是告诉编译器该常数的属性。
默认为有符号INT型,加了u就是无符号的,加了l就是long型。
做下移位就知道结果了。以0x80为例,左移次数过多编译器会提示你符号位被改变,即负数被移位成正数。加个u的话就被编译器识别为无符号数,可以随意移位。不会影响符号位。
个人理解,请自行查证真伪。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

151

主题

970

帖子

2

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