当没有给出显式整数后缀时,参数'输入'的规则是什么?

时间:2014-05-30 15:47:04

标签: c++ c gcc constants

例如,如果我要说:

#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吗?

3 个答案:

答案 0 :(得分:5)

#define SOME_DEF 500

500的类型为int。未填充的十进制整数常量的类型是相应列表中可以表示其值的第一个intlonglong 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

因此,如果您的十进制整数常量没有后缀,则其类型将是可以表示该值的intlong intlong long int中的最小值。

答案 2 :(得分:1)

不是那么优雅,但可能是演员:

#include <inttypes.h> /* For uint16_t */

#define MYFLOAT ((float) 1)

#define MYUNSIGNED16BITINT ((uint16_t) 42.)

#define MYVOIDPOINTER ((void *) 0)