362 lines
29 KiB
HTML
362 lines
29 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>整数字面量</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_language_integer_literal skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">整数字面量</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>允许在表达式中直接使用整数类型的值。</p>
|
|
<h3><span class="mw-headline" id=".E8.AF.AD.E6.B3.95">语法</span></h3>
|
|
<p>整数字面量拥有以下形式</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">十进制字面量</span> <span class="t-spar">整数后缀</span><span class="t-mark">(可选)</span></td>
|
|
<td>(1)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">八进制字面量</span> <span class="t-spar">整数后缀</span><span class="t-mark">(可选)</span></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">十六进制字面量</span> <span class="t-spar">整数后缀</span><span class="t-mark">(可选)</span></td>
|
|
<td>(3)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">二进制字面量</span> <span class="t-spar">整数后缀</span><span class="t-mark">(可选)</span></td>
|
|
<td>(4)</td>
|
|
<td><span class="t-mark-rev t-since-cxx14">(C++14 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>其中</p>
|
|
<ul>
|
|
<li><span class="t-spar">十进制字面量</span> 是一个非零十进制位(<code>1</code>、<code>2</code>、<code>3</code>、<code>4</code>、<code>5</code>、<code>6</code>、<code>7</code>、<code>8</code>、<code>9</code>)后随零或多个十进制位(<code>0</code>、<code>1</code>、<code>2</code>、<code>3</code>、<code>4</code>、<code>5</code>、<code>6</code>、<code>7</code>、<code>8</code>、<code>9</code>)</li>
|
|
<li><span class="t-spar">八进制字面量</span> 是数位零(<code>0</code>)后随零或多个八进制位(<code>0</code>、<code>1</code>、<code>2</code>、<code>3</code>、<code>4</code>、<code>5</code>、<code>6</code>、<code>7</code>)</li>
|
|
<li><span class="t-spar">十六进制字面量</span> 是字符序列 <code>0x</code> 或字符序列 <code>0X</code> 后随一或多个十六进制数位(<code>0</code>、<code>1</code>、<code>2</code>、<code>3</code>、<code>4</code>、<code>5</code>、<code>6</code>、<code>7</code>、<code>8</code>、<code>9</code>、<code>a</code>、<code>A</code>、<code>b</code>、<code>B</code>、<code>c</code>、<code>C</code>、<code>d</code>、<code>D</code>、<code>e</code>、<code>E</code>、<code>f</code>、<code>F</code>)</li>
|
|
<li><span class="t-spar">二进制字面量</span> 是字符序列 <code>0b</code> 或字符序列 <code>0B</code> 后随一或多个二进制位(<code>0</code>、<code>1</code>)</li>
|
|
<li>若提供 <span class="t-spar">整数后缀</span>,则可含有下列一或两者(若均提供,则可以任意顺序出现):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li><span class="t-spar">无符号后缀</span>(字符 <code>u</code> 或字符 <code>U</code>)</li>
|
|
<li>以下之一</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li><span class="t-spar">长后缀</span>(字符 <code>l</code> 或字符 <code>L</code>)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</dd>
|
|
</dl>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<dl>
|
|
<dd>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li><span class="t-spar">长长后缀</span>(字符序列 <code>ll</code> 或字符序列 <code>LL</code>)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</dd>
|
|
</dl>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx23">
|
|
<td>
|
|
<dl>
|
|
<dd>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li><span class="t-spar">大小后缀</span>(字符 <code>z</code> 或字符 <code>Z</code>)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</dd>
|
|
</dl>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx23">(C++23 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p><span id=".E5.8D.95.E5.BC.95.E5.8F.B7"></span></p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx14">
|
|
<td>
|
|
<p>数位间可插入作为分隔符的可选的单引号(<code>'</code>)。编译器会忽略它们。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx14">(C++14 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>整数字面量(与任何字面量相同)是<a href="cpp-language-expressions.html#.E5.88.9D.E7.AD.89.E8.A1.A8.E8.BE.BE.E5.BC.8F">初等表达式</a>。</p>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<div class="t-li1"><span class="t-li">1)</span> 十进制整数字面量(以 10 为底)</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 八进制整数字面量(以 8 为底)</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 十六进制整数字面量(以 16 为底,字母 'a' 到 'f' 表示(十进制)值 10 到 15)</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> 二进制整数字面量(以 2 为底)</div>
|
|
<p>整数字面量的首位为最高位。</p>
|
|
<p>例如,下列变量被初始化到相同值:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw4">int</span> d <span class="sy1">=</span> <span class="nu0">42</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> o <span class="sy1">=</span> <span class="nu8">052</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> x <span class="sy1">=</span> <span class="nu12">0x2a</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> X <span class="sy1">=</span> <span class="nu12">0X2A</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> b <span class="sy1">=</span> <span class="nu6">0b101010</span><span class="sy4">;</span> <span class="co1">// C++14</span></pre></div>
|
|
</div>
|
|
<p>例如,下列变量也被初始化为相同值:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> l1 <span class="sy1">=</span> 18446744073709550592ull<span class="sy4">;</span> <span class="co1">// C++11</span>
|
|
<span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> l2 <span class="sy1">=</span> <span class="nu0">18</span><span class="st0">'446'</span><span class="nu0">744</span><span class="st0">'073'</span><span class="nu0">709</span><span class="st0">'550'</span>592llu<span class="sy4">;</span> <span class="co1">// C++14</span>
|
|
<span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> l3 <span class="sy1">=</span> <span class="nu0">1844</span><span class="st0">'6744'</span><span class="nu8">0737</span><span class="st0">'0955'</span>0592uLL<span class="sy4">;</span> <span class="co1">// C++14</span>
|
|
<span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> l4 <span class="sy1">=</span> <span class="nu0">184467</span><span class="st0">'440737'</span><span class="nu0">0</span><span class="st0">'95505'</span>92LLU<span class="sy4">;</span> <span class="co1">// C++14</span></pre></div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.AD.97.E9.9D.A2.E9.87.8F.E7.9A.84.E7.B1.BB.E5.9E.8B">字面量的类型</span></h3>
|
|
<p>整数字面量的类型,是依赖于所用数字基底和 <span class="t-spar">整数后缀</span> 的列表中,首个能适合其值的类型。</p>
|
|
<table class="wikitable">
|
|
<tr style="text-align:center">
|
|
<th>后缀</th>
|
|
<th>十进制底</th>
|
|
<th>二进制,十六进制或八进制底</th>
|
|
</tr>
|
|
<tr style="text-align:left">
|
|
<td>(无后缀)</td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>u</code> 或 <code>U</code></td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>l</code> 或 <code>L</code></td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-until-cxx11">(C++11 前)</span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>同时有 <code>l</code>/<code>L</code> 和 <code>u</code>/<code>U</code></td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>ll</code> 或 <code>LL</code></td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>同时有 <code>ll</code>/<code>LL</code> 和 <code>u</code>/<code>U</code></td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>z</code> 或 <code>Z</code></td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-lc"><a href="cpp-types-size_t.html">std::size_t</a></span> 的有符号版本<span class="t-mark-rev t-since-cxx23">(C++23 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-lc"><a href="cpp-types-size_t.html">std::size_t</a></span> 的有符号版本<span class="t-mark-rev t-since-cxx23">(C++23 起)</span></li>
|
|
<li><span class="t-lc"><a href="cpp-types-size_t.html">std::size_t</a></span><span class="t-mark-rev t-since-cxx23">(C++23 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>同时有 <code>z</code>/<code>Z</code> 和 <code>u</code>/<code>U</code></td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-lc"><a href="cpp-types-size_t.html">std::size_t</a></span><span class="t-mark-rev t-since-cxx23">(C++23 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-lc"><a href="cpp-types-size_t.html">std::size_t</a></span><span class="t-mark-rev t-since-cxx23">(C++23 起)</span></li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p>若整数字面量的值过大,而无法符合任何后缀/底组合所允许的类型,且编译器支持扩展整数类型(如 <span class="t-c"><span class="mw-geshi cpp source-cpp">__int128</span></span>),则字面量可以被授予扩展整数类型——否则程序非良构。</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>整数字面量中的字母是无关大小写的:<code>0xDeAdBaBeU</code> 与 <code>0XdeadBABEu</code> 表示同一数值<span class="t-rev-inl t-since-cxx11"><span>(一个例外是 <span class="t-spar">长长后缀</span>,它是 <code>ll</code> 或 <code>LL</code>,而决不能是 <code>lL</code> 或 <code>Ll</code>)</span> <span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></span></span></p>
|
|
<p>没有负整数字面量。如 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">-</span><span class="nu0">1</span></span></span> 这样的表达式对字面量所表示的值运用<a href="cpp-language-operator_arithmetic.html">一元减运算符</a>,这可能涉及隐式转换。</p>
|
|
<p>在 C99 之前的 C 中(但不是 C++ 中),不符合 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">int</span></span></span> 的无后缀十进制值允许拥有类型 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">int</span></span></span>。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p>当用于 <a href="cpp-preprocessor-conditional.html">#if</a> 或 <a href="c-preprocessor-conditional.html">#elif</a> 的控制表达式时,全部有符号整数常量表现如同它们具有 <span class="t-lc"><a href="cpp-types-integer.html">std::intmax_t</a></span> 类型,而全部无符号整数常量表现如同它们具有 <span class="t-lc"><a href="cpp-types-integer.html">std::uintmax_t</a></span> 类型。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>由于<a href="cpp-language-translation_phases.html#.E6.9C.80.E5.A4.A7.E5.90.9E.E5.99.AC">最大吞噬</a>规则,以 <code>e</code> 和 <code>E</code> 结束的十六进制整数字面量在后随运算符 <code>+</code> 或 <code>-</code> 时,源码中必须以空白符或括号将它们与运算符分隔:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw4">auto</span> x <span class="sy1">=</span> <span class="nu12">0xE</span><span class="sy2">+</span><span class="nu16">2.0</span><span class="sy4">;</span> <span class="co1">// 错误</span>
|
|
<span class="kw4">auto</span> y <span class="sy1">=</span> <span class="nu12">0xa</span><span class="sy2">+</span><span class="nu16">2.0</span><span class="sy4">;</span> <span class="co1">// OK</span>
|
|
<span class="kw4">auto</span> z <span class="sy1">=</span> <span class="nu12">0xE</span> <span class="sy2">+</span><span class="nu16">2.0</span><span class="sy4">;</span> <span class="co1">// OK</span>
|
|
<span class="kw4">auto</span> q <span class="sy1">=</span> <span class="br0">(</span><span class="nu12">0xE</span><span class="br0">)</span><span class="sy2">+</span><span class="nu16">2.0</span><span class="sy4">;</span> <span class="co1">// OK</span></pre></div>
|
|
</div>
|
|
<p>否则,将构成一个非法的预处理数字记号,并导致进一步的分析失败。</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <cstddef></span>
|
|
<span class="co2">#include <iostream></span>
|
|
<span class="co2">#include <type_traits></span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="nu0">123</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="nu8">0123</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="nu12">0x123</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="nu6">0b10</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> 12345678901234567890ull <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> 12345678901234567890u <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span> <span class="co1">// 类型是 unsigned long long</span>
|
|
<span class="co1">// 即使无 long long 后缀</span>
|
|
|
|
<span class="co1">// std::cout << -9223372036854775808 << '\n'; // 错误:值 9223372036854775808</span>
|
|
<span class="co1">// 不吻合 signed long long,这是无后缀整数字面量允许的最大类型</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="sy2">-</span>9223372036854775808u <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span> <span class="co1">// 应用于无符号值的一元减</span>
|
|
<span class="co1">// 从 2^64 减去该值,给出 9223372036854775808</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="sy2">-</span><span class="nu0">9223372036854775807</span> <span class="sy2">-</span> <span class="nu0">1</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span> <span class="co1">// 计算值 -9223372036854775808</span>
|
|
<span class="co1">// 的正确方式</span>
|
|
|
|
<span class="co2">#if __cpp_size_t_suffix >= 202011L // C++23</span>
|
|
static_assert<span class="br0">(</span><a href="cpp-types-is_same.html"><span class="kw589">std::<span class="me2">is_same_v</span></span></a><span class="sy1"><</span>decltype<span class="br0">(</span>0UZ<span class="br0">)</span>, <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><span class="sy1">></span><span class="br0">)</span><span class="sy4">;</span>
|
|
static_assert<span class="br0">(</span><a href="cpp-types-is_same.html"><span class="kw589">std::<span class="me2">is_same_v</span></span></a><span class="sy1"><</span>decltype<span class="br0">(</span>0Z<span class="br0">)</span>, <a href="cpp-types-make_signed.html"><span class="kw617">std::<span class="me2">make_signed_t</span></span></a><span class="sy1"><</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><span class="sy1">>></span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="co2">#endif</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">123
|
|
83
|
|
291
|
|
2
|
|
12345678901234567890
|
|
12345678901234567890
|
|
9223372036854775808
|
|
-9223372036854775808</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td><a href="cpp-language-user_literal.html">用户定义字面量</a><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td>拥有用户定义后缀的字面量</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|