2.14.2 Integer literals 2

书籍:《ISO/IEC 14882 2014》

说明:以上内容大部分来自腾讯元宝。

如何理解以下内容:

1
An integer literal is a sequence of digits that has no period or exponent part, with optional separating single quotes that are ignored when determining its value. An integer literal may have a prefix that specifies its base and a suffix that specifies its type. The lexically first digit of the sequence of digits is the most significant. A decimal integer literal (base ten) begins with a digit other than 0 and consists of a sequence of decimal digits. An octal integer literal (base eight) begins with the digit 0 and consists of a sequence of octal digits. 22 A hexadecimal integer literal (base sixteen) begins with 0x or 0X and consists of a sequence of hexadecimal digits, which include the decimal digits and the letters a through f and A through F with decimal values ten through fifteen. A binary integer literal (base two) begins with 0b or 0B and consists of a sequence of binary digits. [ Example: The number twelve can be written 12 , 014 , 0XC , or 0b1100. The literals 1048576 , 1’048’576 , 0X100000 , 0x10’0000 , and 0’004’000’000 all have the same value. — end  example ]

一、整数字面量的基本结构

整数字面量的定义分为三个核心部分:

  1. ​数字序列​​:由数字字符组成,无小数点或指数部分。
  2. ​分隔符(可选)​​:单引号'用于提高可读性,不影响数值(C++14引入)。
  3. ​前缀(可选)​​:指定进制(如0x表示十六进制)。
  4. ​后缀(可选)​​:指定类型(如u表示无符号整数)。

​示例​​:

int a = 12;         // 十进制
int b = 014;        // 八进制(等价于十进制12)
int c = 0XC;        // 十六进制(等价于十进制12)
int d = 0b1100;     // 二进制(等价于十进制12)

二、进制规则详解

1. ​​十进制(Decimal)​
  • ​前缀​​:无。
  • ​数字范围​​:1-9开头,后跟任意数字(可含分隔符)。
  • ​示例​​:
    int x = 1'000'000;  // 分隔符提高可读性,等价于1000000[1,6](@ref)
2. ​​八进制(Octal)​
  • ​前缀​​:0(零)。
  • ​数字范围​​:0-7
  • ​示例​​:
    int y = 0377;       // 八进制最大值(等价于十进制255)
3. ​​十六进制(Hexadecimal)​
  • ​前缀​​:0x0X
  • ​数字范围​​:0-9a-f(或A-F)。
  • ​示例​​:
    int z = 0XFF;       // 十六进制最大值(等价于十进制255)
4. ​​二进制(Binary)​
  • ​前缀​​:0b0BC++14引入)。
  • ​数字范围​​:0-1
  • ​示例​​:
    int w = 0b1111'1111; // 二进制最大值(等价于十进制255)

三、类型后缀的作用

后缀用于显式指定整数字面量的类型,规则如下:

后缀类型示例
uunsigned int42u
llong123l
lllong long123ll
ulunsigned long123ul
ullunsigned long long123ull

​规则​​:

  • 后缀顺序不影响类型(如LUUL等价)。
  • 无后缀时,类型由数值大小决定(如42默认为int)。

四、示例解析

示例1:相同值的多种表示
int a = 1048576;       // 十进制
int b = 1'048'576;     // 十进制(分隔符)
int c = 0X100000;      // 十六进制(0x100000 = 1,048,576)
int d = 0x10'0000;     // 十六进制(分隔符)
int e = 0'004'000'000; // 十进制(分隔符,等价于4,000,000)
  • ​结论​​:所有字面量均等于十进制1,048,576
示例2:进制转换
int f = 014;           // 八进制14 → 十进制12
int g = 0XC;           // 十六进制C → 十进制12
int h = 0b1100;        // 二进制1100 → 十进制12

五、关键注意事项

  1. ​分隔符合法性​​:
    • 单引号'仅用于分隔数字,可出现在数字序列首尾连续使用(如'123'非法)。
  2. ​前缀与后缀的顺序​​:
    • 前缀必须位于数字序列后缀必须位于末尾(如0x12u合法,u0x12非法)。
  3. ​非法字符检测​​:
    • 八进制中若包含89(如0389)会导致编译错误。

六、实际应用建议

  • ​明确类型​​:使用后缀避免隐式类型转换(如42u42更安全)。
  • ​可读性优化​​:对大数值使用分隔符(如1'000'000)。
  • ​进制选择​​:二进制用于位操作,十六进制用于内存地址或颜色值,十进制用于通用场景。

通过理解这些规则,可以更精准地控制整数字面量的类型和值,避免因隐式转换或语法错误导致的程序缺陷。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值