C语言宏定义立即数后缀U的含义

背景

在看开源的相关代码中,会有下面的宏定义用法

#define    TEST_VALUE    (0xFFFFFFFFU)

其和下面的宏定义区别是什么呢?

#define    TEST_VALUE    (0xFFFFFFFF)

答疑

U表示 unsigned 无符号后缀,关于后缀的表述C99标准有如下定义:

 (1)  没有后缀的情况

10进制和16进制书写立即数,编译器对其解析是有差异的。

对于10进制:始终认为立即数是有符号类型的。

对于16进制:立即数的符号类型取决于其值的大小。具体看立即数是否落在哪个类型区间,即表格中类型:int,unsigned int;long int,unsigned  long int ;long long int,unsigned  long long int;

(2)有后缀U或u的情况

10进制和16进制书写立即数,编译器对其解析是一致的,始终认为其是无符号类型的

(3)其它情况

注:8进制和18进制现象一样,故只表述16进制

验证

(1)没有后缀的情况

10进制:立即数较小VS立即数较大场景对比

测试方法和结果如下:

 测试结论:对于10进制立即数,没有后缀的情况下,其进行算术操作后的结果始终是有符号数

16进制:立即数较小VS立即数较大场景对比

测试方法和测试结果如下:

  测试结论:对于16进制立即数,没有后缀的情况下,其进行算术操作后的结果始终是有符号数取决于立即数的大小,具体看立即数是否落在哪个类型区间,即表格中类型:int,unsigned int;long int,unsigned  long int ;long long int,unsigned  long long int。

(2)有后缀的情况

10进制:立即数较小VS立即数较大场景对比

测试方法和结果如下:

  测试结论:对于10进制立即数,有后缀的情况下,其进行算术操作后的结果始终是无符号数

16进制:立即数较小VS立即数较大场景对比

测试方法和结果如下:

测试结论:对于16进制立即数,有后缀的情况下,其进行算术操作后的结果始终是无符号数

总结

(1)验证了C标准,关于对立即数符号类型的定义,符合预期。

(2)在C或C++编程的时候,应当对立即数后面加后缀U或L,以明确表示其符合类型。

(3) 避免立即数进行运算的时候,编译器隐含的操作,使得结果不符合预期

(4) 函数重载的时候,能基于明确的参数类型,调用正确的函数

(5) ARM官方ATF Demo源码中,对于C代码编程,关于立即数都会加后缀修饰

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、单项选择题 1、 C语言源程序文件经过C编译程序编译连接之后生成一个后缀为( C )的文件。  A).c B).obj C).exe D).bas 2、 )完成C源文件编辑后、到生成执行文件,C语言处理系统必须执行的步骤依次为( B ) A)连接、编译 B)编译、连接 C)连接、运行 D)运行 3、 关于C语言的叙述中,不正确的是( D ) A)C程序可由一个或多个函数组成 B)C程序必须包含一个main()函数 C)C程序的基本组成单位是函数 D)注释说明只能位于一条语句的后面 4、 一个C程序的执行是从( C )。 A) 本程序的main函数开始,到main函数结束 B) 本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 C) 本程序的main函数开始,到本程序文件的最后一个函数结束 D) 本程序文件的第一个函数开始,到本程序main函数结束 5、 以下正确的叙述是( C ) A) 在C语言中,main函数必须位于文件的开头 B) C语言每行中只能写一条语句 C) C语言本身没有输入、输出语句 D) 对一个C语言进行编译预处理时,可检查宏定义的语法错误 6、 下列选项中,不能用作标识符的是( D )。 A) _1234_ B) _1_2 C) int_2_ D) 2_int_ 7、 常数的书写格式决定了常数的类型和值,0x1011是( C ) A)8进制整型常量 B)字符常量 C)16进制整型常数 D)2进制整型常数 8、 以下4组用户定义标识符中,全部合法的一组是( D ) A)_total clu_1 sum B)if -max turb C)txt REAL 3COM D)int k_2 _001 9、 ( B )是合法的用户自定义标识符。 A) b-b B)float C)123a D) _isw 10、 以下选项中不正确的整型常量是( )。  A) 12L B) -10 C) 1,900 D) 123U 11、 表达式( C )的值是0。 A)3%5 B)3/5)0 C)3/5 D)3<5 12、 设int x=3,y=4,z=5,则下列表达式中的值为0的是 ( ) A) ‘x’&&’y’ B) x||y+z&&y-z C) x<=y D) !((x<y)&&!z||1) 13、 表达式 !(x>0||y>0) 等价于( )。 A)!x>0||!y>0 B)!(x>0)||!(y>0) C)!x>0&&!y>0 D)!(x>0)&&!(y>0) 14、 若变量已正确定义并赋值,表达式( )不符合C语言语法。 A)4&&3 B)+a C)a=b=5 D)int(3)14) 15、 C语句”x*=y+2;”还可以写作( ) A) x=x*y+2; B) x=2+y*x; C) x=x*(y+2); D) x=y+2*x; 16、 下列格式符中,可以用于以8进制形式输出整数的是( ) A) %d B) %o C) %ld D) %x

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑与白818

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值