例如,如果我要说:
#define UINT_DEF 500u
然后这样的定义将具有类型unsigned int
。但是,何时没有给出这样的后缀的默认规则是什么?如在
#define SOME_DEF 500
被放置在int
类型中。也就是说,在编译时,如果没有给出后缀,那么常量是否已插入到它们适合的最低数据类型?
例如,
#define SOME_DEF_2 100
获取char
的数据类型,因为它适合?
我问previous question一个类似的主题并得到了一些好的回答。但是,对没有给出后缀的情况说的很少。据说,如果编译器请求给定的后缀,并且指定的值不适合这种类型,那么常量将被提升,但对此却没什么好说的。我认为答案与此类似,因为默认的转换(可能是最小的可用)被赋予常量,在这种情况下,值不适合这种默认类型,然后实现促销。
最后,算术推广规则是否仍然适用于宏?那就是
#define TEST_DEF 5000000/50
#define TEST_DEF_2 5000000/50.0
分别评估为100,000,类型为long int
,100,000.00为float
类型(假设5,000,000为长,50为int / char,无论如何)。
或者在案件中:
#define TEST_MACRO(x) (16*x)
由于16是int
类型的常量,因此TEST_MACRO(70000)会将整个事物推广到long
吗?
答案 0 :(得分:5)
#define SOME_DEF 500
500
的类型为int
。未填充的十进制整数常量的类型是相应列表中可以表示其值的第一个:int
,long
,long long
。
然后:
#define TEST_DEF 5000000/50
#define TEST_DEF_2 5000000/50.0
假设您的系统中5000000
类型为int
,则:
5000000/50
的类型为int
5000000/50.0
的类型为double
当然它是宏的事实不会改变任何东西,因为宏只是相对简单的文本替换。
最后,假设70000
的类型为int
,那么:
16 * 70000
也属于int
答案 1 :(得分:3)
根据C标准的2011 online draft:
6.4.4.1整数常量
...
5整数常量的类型是相应列表中第一个可以表示其值的列表Suffix Decimal Constant Octal or Hexadecimal Constant ----------------------------------------------------------------- None int int long int unsigned int long long int long int unsigned long int long long int unsigned long long int ----------------------------------------------------------------- u or U unsigned int unsigned int unsigned long int unsigned long int unsigned long long int unsigned long long int ------------------------------------------------------------------ l or L long int long int long long int unsigned long int long long int unsigned long long int ------------------------------------------------------------------ Both u or U unsigned long int unsigned long int and l or L unsigned long long int unsigned long long int ------------------------------------------------------------------ ll or LL long long int long long int unsigned long long int ------------------------------------------------------------------ Both u or U unsigned long long int unsigned long long int and ll or LL
因此,如果您的十进制整数常量没有后缀,则其类型将是可以表示该值的int
,long int
或long long int
中的最小值。
答案 2 :(得分:1)
不是那么优雅,但可能是演员:
#include <inttypes.h> /* For uint16_t */
#define MYFLOAT ((float) 1)
#define MYUNSIGNED16BITINT ((uint16_t) 42.)
#define MYVOIDPOINTER ((void *) 0)