﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C++ Programmer-随笔分类-Grammar</title><link>http://www.cppblog.com/suiaiguo/category/11204.html</link><description>天行健，君子以自强不息；
地势坤，君子以厚德载物</description><language>zh-cn</language><lastBuildDate>Thu, 16 Jul 2009 11:29:59 GMT</lastBuildDate><pubDate>Thu, 16 Jul 2009 11:29:59 GMT</pubDate><ttl>60</ttl><item><title>隐式类型转换&amp;&amp; 负数的补码</title><link>http://www.cppblog.com/suiaiguo/archive/2009/07/16/90228.html</link><dc:creator>Saga</dc:creator><author>Saga</author><pubDate>Thu, 16 Jul 2009 07:01:00 GMT</pubDate><guid>http://www.cppblog.com/suiaiguo/archive/2009/07/16/90228.html</guid><wfw:comment>http://www.cppblog.com/suiaiguo/comments/90228.html</wfw:comment><comments>http://www.cppblog.com/suiaiguo/archive/2009/07/16/90228.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/suiaiguo/comments/commentRss/90228.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/suiaiguo/services/trackbacks/90228.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;偶然看到一道C++面试题：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;foo(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_22_143_Open_Image onclick="this.style.display='none'; Codehighlighter1_22_143_Open_Text.style.display='none'; Codehighlighter1_22_143_Closed_Image.style.display='inline'; Codehighlighter1_22_143_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_22_143_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_22_143_Closed_Text.style.display='none'; Codehighlighter1_22_143_Open_Image.style.display='inline'; Codehighlighter1_22_143_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_22_143_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_22_143_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">b</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">puts(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;6</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">):puts(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;=6</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">puts为打印函数</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
&nbsp;&nbsp;&nbsp;问输出是什么？答案是输出 &gt;6。<br>&nbsp;&nbsp;&nbsp;这道题主要考察两个东西。<br>&nbsp;&nbsp;&nbsp;1.隐式类型转换：int型变量转化成unsigned int,　b成了正数．<br>&nbsp;&nbsp;&nbsp;2.负数的补码：计算机系统中的数值是以补码形式表示（存储）的。<br><br><strong>一、C++隐式类型转换<br></strong>
<p>&nbsp;&nbsp;&nbsp;C++定义了一组内置的类型对象之间的标准转换，在必要时它们被编译器隐式的应用到对象上。在算式转换保证了二元操作符，如加法或乘法的两个操作数被提升为共同的类型，然后再用它表示结果的类型。两个通用的指导原则如下：<br>&nbsp;&nbsp;&nbsp; 1、为防止精度损失，如果必要的话，类型总是被提升为较宽的类型。<br>&nbsp;&nbsp;&nbsp; 2、所有含有小于整形的有序类型的算术表达式在计算之前其类型都会被转换成整形。<br>&nbsp;&nbsp;&nbsp; 规则的定义如上面所述，这些规则定义了一个类型转换层次结构，我们从最宽的类型long double 开始，那么另一个操作数无论是什么类型都将被转换成long double .如果两个操作数千不是long double 型，那么若其中一个操作数的类型是double 型，则另一个就被转换成double 型。例如：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ival;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;fval;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;dval;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dval&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;fval&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ival&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在计算加法前fval和ival都被转换成double<br></span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 类似地，如果两个操作数都不是double型而其中一个操作float型 ，则另一个被转换成float型。例如：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cval;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ival;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;fval;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cval&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ival&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;fval&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在计算加法前ival和cval都被转换成float</span></div>
<p>&nbsp;&nbsp;&nbsp; 否则如果两个操作数都不是3种浮点类型之一，它们一定是某种整值类型。在确定共同的目标提升类型之前，编译器将在所有小于int 的整值类型上施加一个被称为整值提升的过程。<br>&nbsp;&nbsp;&nbsp; 在进行整值提升时类型char、signed char、unsigned char和short int 都被提升为类型int 。如果机器上的类型空间足够表示所有unsigned short 型的值，这通常发生在short用半个字而int 用一个字表示的情况下，则unsigned short int 也被转换成int 否则它会被提升为unsigned int 。wchar_t和枚举类型被提升为能够表示其底层类型所有值的最小整数类型。在下列表达式中：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cval;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;found;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;mumber{m1,m2,m3}mval;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">ulong</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cval&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">ulong</span><span style="COLOR: #000000">;</span><span style="COLOR: #0000ff">ulong</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;found;&nbsp;mval&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">ulong</span><span style="COLOR: #000000">;</span></div>
<p>&nbsp;&nbsp;&nbsp;在确定两个操作数被提升的公共类型之前，cval found 和mval都被提升为int 类型。<br>&nbsp;&nbsp;&nbsp; 一旦整值提升执行完毕，类型比较就又一次开始。如果一个操作数是unsigned long 型，则第二个也被转换成unsigned long 型。在上面的例子中所有被加到ulong上的3个对象都被提升为unsigned long 型。如果两个操作数类型都不是unsigned long型 而其中一个操作数是long型，则另一个也被转换成long型。例如：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cval;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;lval;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cval&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1024</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;lval;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在计算加法前cval和1024都被提升为long型。<br></span></div>
<p>&nbsp;&nbsp;&nbsp; long类型的一般转换有一个例外。如果一个操作数是long型而另一个是unsigned int 型，那么只有机器上的long型的长度足以容纳unsigned int 的所有值时（一般来说，在32位操作系统中long型和int 型都用一长表示，所以不满足这里的假设条件），unsigned int 才会被转换为long型，否则两个操作数都被提升为unsigned long 型。若两个操作数都不是long型而其中一个是unsigned int 型，则另一个也被转换成unsigned int 型，否则两个操作数一定都是int 型。<br>&nbsp;&nbsp;&nbsp;<span style="COLOR: red">一般来说各种类型的长度关系为 long double &gt; double&nbsp;&gt; float &gt;=&nbsp; int &gt;= short &gt; char，unsigned &gt; signed 。</span><br>&nbsp;&nbsp;&nbsp; 尽管算术转换的这些规则带给你的困惑可能多于启发，但是一般的思想是尽可能地保留类型表达式中涉及到的值的精度。这下是通过把不同的类型提升到当前出现的最宽的类型实现的。<br><br><strong>二、负数的补码<br><br></strong>&nbsp;&nbsp;&nbsp;在计算机系统中，数值一律用补码来表示（存储）。&nbsp;<br>&nbsp;&nbsp;&nbsp;主要原因：使用补码，可以将符号位和其它位统一处理；同时，减法也可按加法来处理。另外，两个用补码表示的数相加时，如果最高位（符号位）有进位，则进位被舍弃。&nbsp;<br>&nbsp;&nbsp;&nbsp;补码与原码的转换过程几乎是相同的。&nbsp;<br>&nbsp;&nbsp;&nbsp;数值的补码表示也分两种情况： <br>（1）正数的补码：与原码相同。&nbsp;<br>&nbsp;&nbsp;&nbsp;例如，+9的补码是00001001。 <br>（2）负数的补码：符号位为1，其余位为该数绝对值的原码按位取反；然后整个数加1。&nbsp;<br>&nbsp;&nbsp;&nbsp;例如，-7的补码：因为是负数，则符号位为&#8220;1&#8221;,整个为10000111；其余7位为-7的绝对值+7的原码0000111按位取反为1111000；再加1，所以-7的补码是11111001。&nbsp;<br>&nbsp;&nbsp;&nbsp;已知一个数的补码，求原码的操作分两种情况： <br>（1）如果补码的符号位为&#8220;0&#8221;，表示是一个正数，所以补码就是该数的原码。 <br>（2）如果补码的符号位为&#8220;1&#8221;，表示是一个负数，求原码的操作可以是：符号位为1，其余各位取反，然后再整个数加1。&nbsp;<br>&nbsp;&nbsp;&nbsp;例如，已知一个补码为11111001，则原码是10000111（-7）：因为符号位为&#8220;1&#8221;，表示是一个负数，所以该位不变，仍为&#8220;1&#8221;；其余7位1111001取反后为0000110；再加1，所以是10000111。 <br></p>
<img src ="http://www.cppblog.com/suiaiguo/aggbug/90228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/suiaiguo/" target="_blank">Saga</a> 2009-07-16 15:01 <a href="http://www.cppblog.com/suiaiguo/archive/2009/07/16/90228.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的位域（bit-filed）:一种节省空间的成员</title><link>http://www.cppblog.com/suiaiguo/archive/2009/07/16/90211.html</link><dc:creator>Saga</dc:creator><author>Saga</author><pubDate>Thu, 16 Jul 2009 03:50:00 GMT</pubDate><guid>http://www.cppblog.com/suiaiguo/archive/2009/07/16/90211.html</guid><wfw:comment>http://www.cppblog.com/suiaiguo/comments/90211.html</wfw:comment><comments>http://www.cppblog.com/suiaiguo/archive/2009/07/16/90211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/suiaiguo/comments/commentRss/90211.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/suiaiguo/services/trackbacks/90211.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp; 有一种被称为位域（bit-field） 的特殊的类数据成员，它可以被声明用来存放特定数目的位。位域必须是有序数据类型。它可以有符号也可以无符号。例如：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_11_65_Open_Image onclick="this.style.display='none'; Codehighlighter1_11_65_Open_Text.style.display='none'; Codehighlighter1_11_65_Closed_Image.style.display='inline'; Codehighlighter1_11_65_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_11_65_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_11_65_Closed_Text.style.display='none'; Codehighlighter1_11_65_Open_Image.style.display='inline'; Codehighlighter1_11_65_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;File&nbsp;</span><span id=Codehighlighter1_11_65_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_11_65_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"></span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;modified&nbsp;:&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;位域&nbsp;(bit-field)</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;</span></div>
<p>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;位域标识符后面跟有一个冒号，然后是一个常量表达式指定位数。例如modified 是一个只有一位构成的位域。<br>&nbsp;&nbsp;&nbsp;在类体中相邻定义的位域，如果可能的话，它们会被放在同一个整数的连续位中，并以此提供空间压缩。例如，在下列声明中5 个位域被存储在单个unsigned int 中，它首先与位域mode 相关联。</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">typedef&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Bit;<br><img id=Codehighlighter1_37_141_Open_Image onclick="this.style.display='none'; Codehighlighter1_37_141_Open_Text.style.display='none'; Codehighlighter1_37_141_Closed_Image.style.display='inline'; Codehighlighter1_37_141_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_37_141_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_37_141_Closed_Text.style.display='none'; Codehighlighter1_37_141_Open_Image.style.display='inline'; Codehighlighter1_37_141_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;File&nbsp;</span><span id=Codehighlighter1_37_141_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_37_141_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>Bit&nbsp;mode:&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>Bit&nbsp;modified:&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>Bit&nbsp;prot_owner:&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>Bit&nbsp;prot_group:&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>Bit&nbsp;prot_world:&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"></span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;<span style="COLOR: red">位域在内存中的位置是从低位向高位放置的，比如mode在Bit的最低两位（二进制数0b0000000000000011中两个1的位置）。</span><br>&nbsp;&nbsp;&nbsp;对于位域的访问方式与其他类数据成员相同。例如，类的私有位域只能在类的成员函数和友元中被访问：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;File::write()<br><img id=Codehighlighter1_19_42_Open_Image onclick="this.style.display='none'; Codehighlighter1_19_42_Open_Text.style.display='none'; Codehighlighter1_19_42_Closed_Image.style.display='inline'; Codehighlighter1_19_42_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_19_42_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_19_42_Closed_Text.style.display='none'; Codehighlighter1_19_42_Open_Image.style.display='inline'; Codehighlighter1_19_42_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_19_42_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_19_42_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>modified&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"></span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;File::close()<br><img id=Codehighlighter1_63_93_Open_Image onclick="this.style.display='none'; Codehighlighter1_63_93_Open_Text.style.display='none'; Codehighlighter1_63_93_Closed_Image.style.display='inline'; Codehighlighter1_63_93_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_63_93_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_93_Closed_Text.style.display='none'; Codehighlighter1_63_93_Open_Image.style.display='inline'; Codehighlighter1_63_93_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_63_93_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_63_93_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;modified&nbsp;)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;内容从略</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span></div>
<p>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;下面的例子说明了怎样使用大于1 位的位域<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_5_29_Open_Image onclick="this.style.display='none'; Codehighlighter1_5_29_Open_Text.style.display='none'; Codehighlighter1_5_29_Closed_Image.style.display='inline'; Codehighlighter1_5_29_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_5_29_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_5_29_Closed_Text.style.display='none'; Codehighlighter1_5_29_Open_Image.style.display='inline'; Codehighlighter1_5_29_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_5_29_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_5_29_Open_Text><span style="COLOR: #000000">{&nbsp;READ&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">01</span><span style="COLOR: #000000">,&nbsp;WRITE&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">02</span><span style="COLOR: #000000">&nbsp;}</span></span><span style="COLOR: #000000">;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;文件模式</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_51_154_Open_Image onclick="this.style.display='none'; Codehighlighter1_51_154_Open_Text.style.display='none'; Codehighlighter1_51_154_Closed_Image.style.display='inline'; Codehighlighter1_51_154_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_51_154_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_51_154_Closed_Text.style.display='none'; Codehighlighter1_51_154_Open_Image.style.display='inline'; Codehighlighter1_51_154_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()&nbsp;</span><span id=Codehighlighter1_51_154_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_51_154_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>File&nbsp;myFile;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>myFile.mode&nbsp;</span><span style="COLOR: #000000">|=</span><span style="COLOR: #000000">&nbsp;READ;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;myFile.mode&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;READ&nbsp;)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">myFile.mode&nbsp;is&nbsp;set&nbsp;to&nbsp;READ\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;通常情况下我们会定义一组inline 成员函数，来测试每个位域成员的值。例如，类File可以定义成员isRead()和isWrite()<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_26_48_Open_Image onclick="this.style.display='none'; Codehighlighter1_26_48_Open_Text.style.display='none'; Codehighlighter1_26_48_Closed_Image.style.display='inline'; Codehighlighter1_26_48_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_26_48_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_26_48_Closed_Text.style.display='none'; Codehighlighter1_26_48_Open_Image.style.display='inline'; Codehighlighter1_26_48_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #000000">inline&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;File::isRead()&nbsp;</span><span id=Codehighlighter1_26_48_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_26_48_Open_Text><span style="COLOR: #000000">{&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;mode&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;READ;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_77_100_Open_Image onclick="this.style.display='none'; Codehighlighter1_77_100_Open_Text.style.display='none'; Codehighlighter1_77_100_Closed_Image.style.display='inline'; Codehighlighter1_77_100_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_77_100_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_77_100_Closed_Text.style.display='none'; Codehighlighter1_77_100_Open_Image.style.display='inline'; Codehighlighter1_77_100_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>inline&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;File::isWrite()&nbsp;</span><span id=Codehighlighter1_77_100_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_77_100_Open_Text><span style="COLOR: #000000">{&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;mode&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;WRITE;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_125_133_Open_Image onclick="this.style.display='none'; Codehighlighter1_125_133_Open_Text.style.display='none'; Codehighlighter1_125_133_Closed_Image.style.display='inline'; Codehighlighter1_125_133_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_125_133_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_125_133_Closed_Text.style.display='none'; Codehighlighter1_125_133_Open_Image.style.display='inline'; Codehighlighter1_125_133_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;myFile.isRead()&nbsp;)&nbsp;</span><span id=Codehighlighter1_125_133_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_125_133_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;</span><span style="COLOR: #008000">*/</span></span></div>
<p><br>&nbsp;&nbsp;&nbsp;有了这些成员函数，现在位域可以被声明为类File 的私有成员。<br>&nbsp;&nbsp;&nbsp;<span style="COLOR: red">由于取地址操作符&amp; 不能被应用在位域上，所以也没有能指向类的位域的指针。位域也不能是类的静态成员。</span><br>&nbsp;&nbsp;&nbsp;C++标准库提供了一个bitset 类模板，它可以辅助操纵位的集合。在可能的情况下应尽可能使用它来取代位域。</p>
<img src ="http://www.cppblog.com/suiaiguo/aggbug/90211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/suiaiguo/" target="_blank">Saga</a> 2009-07-16 11:50 <a href="http://www.cppblog.com/suiaiguo/archive/2009/07/16/90211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>