📄 14.8.htm
字号:
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Hyperlinked ECMA C# Language Specification</title><meta name="author" content="Jon Jagger" /><link rel="stylesheet" href="ecma334.css"></link></head><body><div align="right"><em><a href="http://www.jaggersoft.com">Jon Jagger</a></em></div><div align="right"><a href="mailto:jon@jaggersoft.com">jon@jaggersoft.com</a></div><form method="get" action="http://search.atomz.com/search/"><input size="30" name="sp-q"></input><input type="submit" value="Search C# Spec"></input><input type="hidden" name="sp-a" value="sp10024177"></input><input type="hidden" name="sp-f" value="ISO-8859-1"></input></form><a href="toc.htm">Table of Contents</a> <a href="1.htm">1</a> <a href="2.htm">2</a> <a href="3.htm">3</a> <a href="4.htm">4</a> <a href="5.htm">5</a> <a href="6.htm">6</a> <a href="7.htm">7</a> <a href="8.htm">8</a> <a href="9.htm">9</a> <a href="10.htm">10</a> <a href="11.htm">11</a> <a href="12.htm">12</a> <a href="13.htm">13</a> <a href="14.htm">14</a> <a href="15.htm">15</a> <a href="16.htm">16</a> <a href="17.htm">17</a> <a href="18.htm">18</a> <a href="19.htm">19</a> <a href="20.htm">20</a> <a href="21.htm">21</a> <a href="22.htm">22</a> <a href="23.htm">23</a> <a href="24.htm">24</a> <a href="25.htm">25</a> <a href="notes.htm">Notes</a> <a href="HyperlinkedCSharpECMA.zip">Download</a><span class="ruler"></span><span class="heading">ECMA-334 C# Language Specification</span><span class="navigate"><a href="14.7.5.htm"><img src="previous.gif" alt="previous" border="0" /></a><a href="14.9.htm"><img src="next.gif" alt="next" border="0" /></a></span><span class="clause-depth"><a href="13.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="15.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number-link"><a href="14.htm">14</a></span><span class="clause-title-previous"> Expressions</span></span><span class="clause-depth"><a href="14.7.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="14.9.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number">14.8</span><span class="clause-title"> Shift operators</span></span><span class="locator">
Paragraph 1</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P1S1"></a>The << and >> operators are used to perform bit shifting operations.</span> <span class="grammar-production"><span class="name"><a name="shift-expression"></a>shift-expression</span> : <span class="rhs"><span class="non-terminal"><a href="14.7.htm#additive-expression">additive-expression</a></span> </span><span class="rhs"><span class="non-terminal"><a href="14.8.htm#shift-expression">shift-expression</a></span> <span class="terminal"><<</span> <span class="non-terminal"><a href="14.7.htm#additive-expression">additive-expression</a></span> </span><span class="rhs"><span class="non-terminal"><a href="14.8.htm#shift-expression">shift-expression</a></span> <span class="terminal">>></span> <span class="non-terminal"><a href="14.7.htm#additive-expression">additive-expression</a></span> </span></span></span><span class="locator">
Paragraph 2</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P2S1"></a>For an operation of the form x << count or x >> count, binary operator overload resolution (<a href="14.2.4.htm">§14.2.4</a>) is applied to select a specific operator implementation.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P2S2"></a>The operands are converted to the parameter types of the selected operator, and the type of the result is the return type of the operator.</span> </span><span class="locator">
Paragraph 3</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P3S1"></a>When declaring an overloaded shift operator, the type of the first operand must always be the class or struct containing the operator declaration, and the type of the second operand must always be <span class="keyword">int</span>.</span> </span><span class="locator">
Paragraph 4</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P4S1"></a>The predefined shift operators are listed below.</span> <ul><li><span class="sentence"><span class="sentence-number">2</span> <a name="P4S2"></a> Shift left: <pre class="code-example">
int operator <<(int x, int count);
uint operator <<(uint x, int count);
long operator <<(long x, int count);
ulong operator <<(ulong x, int count);
</pre><span class="sentence"><span class="sentence-number">3</span> <a name="P4S3"></a>The << operator shifts x left by a number of bits computed as described below.</span> <span class="sentence"><span class="sentence-number">4</span> <a name="P4S4"></a>The high-order bits outside the range of the result type of x are discarded, the remaining bits are shifted left, and the low-order empty bit positions are set to zero.</span> </span></li><li><span class="sentence"><span class="sentence-number">5</span> <a name="P4S5"></a> Shift right: <pre class="code-example">
int operator >>(int x, int count);
uint operator >>(uint x, int count);
long operator >>(long x, int count);
ulong operator >>(ulong x, int count);
</pre><span class="sentence"><span class="sentence-number">6</span> <a name="P4S6"></a>The >> operator shifts x right by a number of bits computed as described below.</span> <span class="sentence"><span class="sentence-number">7</span> <a name="P4S7"></a>When x is of type <span class="keyword">int</span> or <span class="keyword">long</span>, the low-order bits of x are discarded, the remaining bits are shifted right, and the high-order empty bit positions are set to zero if x is non-negative and set to one if x is negative.</span> <span class="sentence"><span class="sentence-number">8</span> <a name="P4S8"></a>When x is of type <span class="keyword">uint</span> or <span class="keyword">ulong</span>, the low-order bits of x are discarded, the remaining bits are shifted right, and the high-order empty bit positions are set to zero.</span> </span></li></ul></span><span class="locator">
Paragraph 5</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P5S1"></a>For the predefined operators, the number of bits to shift is computed as follows: </span><ul><li><span class="sentence"><span class="sentence-number">2</span> <a name="P5S2"></a> When the type of x is <span class="keyword">int</span> or <span class="keyword">uint</span>, the shift count is given by the low-order five bits of count.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P5S3"></a>In other words, the shift count is computed from count & 0x1F.</span> </li><li><span class="sentence"><span class="sentence-number">4</span> <a name="P5S4"></a> When the type of x is <span class="keyword">long</span> or <span class="keyword">ulong</span>, the shift count is given by the low-order six bits of count.</span> <span class="sentence"><span class="sentence-number">5</span> <a name="P5S5"></a>In other words, the shift count is computed from count & 0x3F.</span> </li></ul></span><span class="locator">
Paragraph 6</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P6S1"></a>If the resulting shift count is zero, the shift operators simply return the value of x.</span> </span><span class="locator">
Paragraph 7</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P7S1"></a>Shift operations never cause overflows and produce the same results in checked and unchecked contexts.</span> </span><span class="locator">
Paragraph 8</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P8S1"></a>When the left operand of the >> operator is of a signed integral type, the operator performs an arithmetic shift right wherein the value of the most significant bit (the sign bit) of the operand is propagated to the high-order empty bit positions.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P8S2"></a>When the left operand of the >> operator is of an unsigned integral type, the operator performs a logical shift right wherein high-order empty bit positions are always set to zero.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P8S3"></a>To perform the opposite operation of that inferred from the operand type, explicit casts can be used.</span> <span class="sentence"><span class="sentence-number">4</span> <a name="P8S4"></a>For example, if x is a variable of type <span class="keyword">int</span>, the operation unchecked((<span class="keyword">int</span>)((<span class="keyword">uint</span>)x >> y)) performs a logical shift right of x.</span> </span><span class="ruler"></span><table><tr><td><table align="left" bgcolor="navy"><tr bgcolor="navy"><td><font face="Arial,sans-serif" size="6" color="yellow"><strong>{ JSL }</strong></font></td></tr></table></td></tr><tr><td><font face="Arial,sans-serif" size="2" color="navy"><strong>Jagger Software Ltd</strong></font></td></tr><tr><td><font face="Arial,sans-serif" size="2" color="navy"><strong>Company # 4070126</strong></font></td></tr><tr><td><font face="Arial,sans-serif" size="2" color="navy"><strong>VAT # 762 5213 42</strong></font></td></tr></table><img src="valid-html401.png" align="left" height="31" width="88" alt="Valid HTML 4.01" /><img src="vcss.gif" align="left" height="31" width="88" alt="Valid CSS" /></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -