﻿<?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++博客-wuzimian-随笔分类-C++</title><link>http://www.cppblog.com/wuzimian/category/19394.html</link><description>努力努力再努力，坚持坚持再坚持</description><language>zh-cn</language><lastBuildDate>Tue, 05 Jun 2012 11:08:29 GMT</lastBuildDate><pubDate>Tue, 05 Jun 2012 11:08:29 GMT</pubDate><ttl>60</ttl><item><title>Linux 创建子进程 fork() exec()</title><link>http://www.cppblog.com/wuzimian/archive/2012/06/05/177655.html</link><dc:creator>吴自勉</dc:creator><author>吴自勉</author><pubDate>Tue, 05 Jun 2012 07:03:00 GMT</pubDate><guid>http://www.cppblog.com/wuzimian/archive/2012/06/05/177655.html</guid><wfw:comment>http://www.cppblog.com/wuzimian/comments/177655.html</wfw:comment><comments>http://www.cppblog.com/wuzimian/archive/2012/06/05/177655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wuzimian/comments/commentRss/177655.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wuzimian/services/trackbacks/177655.html</trackback:ping><description><![CDATA[今天复习操作系统，创建子进程这地方还是比较好玩的。<br />创建子进程：  fork（），这个函数的作用是，创建一个子进程，且这个“子进程”完全是“父进程”的一个“拷贝”，只有进程号不一样。<br />相当于把父进程对应的内存拷贝一份到子进程对应的内存区域。<br />exec()这个系统调用，是把一个新的程序转载到进程的内存空间里面去。<br /><br />Linux下编译运行：<br /><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">types.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unistd.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> main()<br />{<br />  pid_t pid;<br />  </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> num</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />  pid</span><span style="color: #000000; ">=</span><span style="color: #000000; ">fork();              //   父进程返回的pid是大于零的，而创建的子进程返回的pid是 等于0的，这个机制正好用来区分 父进程和子进程<br />  </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(pid</span><span style="color: #000000; ">==</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)//子进程<br />  {  <br />     num</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;  <br />     printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">  %d  \n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,num);                 //如果没有 \n ， num是输不出来的，为什么？因为printf()会把num放在缓冲区，暂时不输出，<br />                                                        //而下一行execlp()系统调用会把子进程的内存清空<br />                                                        //装进‘ls’程序，自然的，缓冲区中的num也就没有了。<br />     execlp(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/bin/ls</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ls</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,NULL);          //  将ls程序装进子进程<br />     printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">after execlp:  %d  \n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,num)；//这一行程序始终得不到执行，为什么？因为上一行的execlp()已经将内存清空，<br />                                                          //所以内存中压根就没有这一行代码。<br />  }<br />  </span><span style="color: #0000FF; ">else      //父进程</span><span style="color: #000000; "><br />  {      <br />         wait(NULL);   //等待子进程结束<br />         printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">  %d  </span><span style="color: #000000; ">"</span><span style="color: #000000; ">,num);<br />         printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\nchild eomplete</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />  }<br />  <br />  <br />}</span></div>其实很简单啦。<br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/wuzimian/aggbug/177655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wuzimian/" target="_blank">吴自勉</a> 2012-06-05 15:03 <a href="http://www.cppblog.com/wuzimian/archive/2012/06/05/177655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 输出类、结构体到文件</title><link>http://www.cppblog.com/wuzimian/archive/2012/05/30/176745.html</link><dc:creator>吴自勉</dc:creator><author>吴自勉</author><pubDate>Wed, 30 May 2012 05:34:00 GMT</pubDate><guid>http://www.cppblog.com/wuzimian/archive/2012/05/30/176745.html</guid><wfw:comment>http://www.cppblog.com/wuzimian/comments/176745.html</wfw:comment><comments>http://www.cppblog.com/wuzimian/archive/2012/05/30/176745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wuzimian/comments/commentRss/176745.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wuzimian/services/trackbacks/176745.html</trackback:ping><description><![CDATA[C++中怎么将我们自己定义的类或结构体输出到文件呢？<br />下面这个小程序演示怎么向文件输出结构体，并且从文件再读到结构体当中。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; "> #include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">fstream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br />  </span><span style="color: #0000FF; ">using</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; "> std;<br />  </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> main()<br />  {<br />      fstream File;<br />      File.open(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">QQ.txt</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,ios::</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">|</span><span style="color: #000000; ">ios::</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">|</span><span style="color: #000000;">ios::binary);//</span><span style="color: #000000; background-color: #ffff00;">二进制不是必须的，ios：：in必须有，否则不能正确读      </span><span style="color: #000000;"><br />      <br /></span><span style="color: #0000FF; ">       struct</span><span style="color: #000000;"> qqq                 //</span><span style="color: #000000; background-color: #ffff00;">自己定义的结构体          </span><span style="color: #000000;"><br />      {<br /></span><span style="color: #0000FF; ">          int</span><span style="color: #000000; "> a;<br />          </span><span style="color: #0000FF; ">double</span><span style="color: #000000; "> b;<br />      };<br />      File.seekp(</span><span style="color: #000000; ">10</span><span style="color: #000000;">);//</span><span style="color: #000000; background-color: #ffff00;">seekp函数定位输出指针，假设定位到10这个位置</span><span style="color: #000000;"><br />      qqq </span><span style="color: #000000; ">*</span><span style="color: #000000; ">node</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> qqq;<br />      node</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">a</span><span style="color: #000000; ">=</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;<br />      node</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">b</span><span style="color: #000000; ">=</span><span style="color: #000000; ">199.199</span><span style="color: #000000; ">;<br />      File.write((</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">char</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; ">)node,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000;">(qqq));  </span><span style="color: #000000; background-color: #ffff00;">//将node指针强制转为成 char * 的指针。</span><span style="color: #000000;"><br />      qqq </span><span style="color: #000000; ">*</span><span style="color: #000000; ">newnode</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> qqq;<br />      File.seekg(</span><span style="color: #000000; ">10</span><span style="color: #000000;">);//</span><span style="color: #000000; background-color: #ffff00;">seekg函数定位输入指针，定位到10这个位置      <br /></span><span style="color: #000000;">      File.read((</span><span style="color: #000000;"></span><span style="color: #0000ff;">char</span><span style="color: #000000; "> </span><span style="color: #000000;">*</span><span style="color: #000000;">)n</span><span style="color: #000000;">ewnode,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000;">(qqq))    </span><span style="color: #000000; background-color: #ffff00;">//将newnode指针强制转为成 char * 的指针</span><span style="color: #000000; ">;   <br />      cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">newnode</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">a</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">newnode</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">b</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br /><br />  }</span></div>其实也很简单啦，就是 强制转换指针类型。<br />这种方式也有局限，就是结构体的大小必须得固定，成员不能有变长的。<br /><br /><br /><img src ="http://www.cppblog.com/wuzimian/aggbug/176745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wuzimian/" target="_blank">吴自勉</a> 2012-05-30 13:34 <a href="http://www.cppblog.com/wuzimian/archive/2012/05/30/176745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于有符号数、无符号数和数据类型的总结</title><link>http://www.cppblog.com/wuzimian/archive/2012/05/28/176482.html</link><dc:creator>吴自勉</dc:creator><author>吴自勉</author><pubDate>Mon, 28 May 2012 04:19:00 GMT</pubDate><guid>http://www.cppblog.com/wuzimian/archive/2012/05/28/176482.html</guid><wfw:comment>http://www.cppblog.com/wuzimian/comments/176482.html</wfw:comment><comments>http://www.cppblog.com/wuzimian/archive/2012/05/28/176482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wuzimian/comments/commentRss/176482.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wuzimian/services/trackbacks/176482.html</trackback:ping><description><![CDATA[转载自：<div>http://blog.sina.com.cn/s/blog_551489c00100g0q0.html</div><br /><br /><div> <p><wbr>一、</wbr></p><p> <wbr> CPU只会根据输入信号进行逻辑运算，在硬件级别是没有有符号无符号的概念，运算结束会根据运算前的信号和输出信号来设置一些标志位，是不是有符号由写程 序的人决定，标志位要看你把操作数当有符号还是无符号来选择，就像内存中的数据，你可以按照需要来解析，原始数据在那里，你要按什么数据格式来解析在于自 己的选择，所以玩汇编的要做到心里有数，加减法只有一套指令，因为这一套指令同时适用于有符号和无符号。下面这些指令：mul div movzx … 是处理无符号数的，而这些：imul idiv movsx … 是处理有符号的。举例来说：<br /> 内存里有 一个字节x 为：0x EC ，一个字节 y 为：0x 02 。当把x，y当作有符号数来看时，x = -20 ，y = +2 。当作无符号数看时，x = 236 ，y = 2 。下面进行加运算，用 add 指令，得到的结果为：0x EE ，那么这个 0x EE 当作有符号数就是：-18 ，无符号数就是 238 。所以，add 一个指令可以适用有符号和无符号两种情况。（呵呵，其实为什么要补码啊，就是为了这个呗，:-)）<br /> 乘法运算就不行了，必须用两套指令，有符号的情况下用imul 得到的结果是：0x FF D8 就是 -40 。无符号的情况下用 mul ，得到：0x 01 D8 就是 472 。</wbr></p><p>二、</p><p> C又是可怕的，因为它把机器层面的所有的东西都反应了出来，像这个有没有符号的问题就是一例（java就不存在这个问题，因为它被设计成所有的整数都是有符号的）。为了说明c的可怕特举一例：<br />  #include &lt;stdio.h&gt;<br /> #include &lt;string.h&gt;<br /><br /> int main()<br /> {<br />  <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> int x = 2;<br />  <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> char * str = "abcd";<br />  <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> int y = (x - strlen(str) ) / 2;<br />  <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr><br />   <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> printf("%d\n",y);<br /> }<br /> 结果应该是 -1 但是却得到：2147483647 。为什么?因为strlen的返回值，类型是size_t，也就是unsigned int ，与 int 混合计算时类型被自动转换了，结果自然出乎意料。。。<br /> 观察编译后的代码，除法指令为 div ，意味无符号除法，即将-2看做无符号数了。<br /> 解决办法就是强制转换，变成 int y = (int)(x - strlen(str) ) / 2; 强制向有符号方向转换（编译器默认正好相反），这样一来，除法指令编译成 idiv 了。我们知道，就是同样状态的两个内存单位，用有符号处理指令 imul ，idiv 等得到的结果，与用无符号处理指令mul，div等得到的结果，是截然不同的！所以牵扯到有符号无符号计算的问题，特别是存在讨厌的自动转换时，要倍加小心！（这里自动转换时，无论gcc还是cl都不提示！！！）<br />  为了避免这些错误，建议，凡是在运算的时候，确保你的变量都是 signed 的。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></p><p> 三、自动类型转化时的，短字节向长字节转化时，有符号数会符号扩展，无符号数会0扩展；长字节向短字节转化时，会自动截取高位，留下低位字节。特别在做算术运算时，比如乘除法，就可能涉及到有符号数自动转化为无符号数，从而采用不同的指令处理。</p><p>例如：下面的代码输出是什么，为什么？</p><p>void foo(void)<br /> {<br /> unsigned int a = 6;<br /> int b = -20;<br /> (a+b &gt; 6) ? puts("&gt; 6") : puts("&lt;= 6");<br /> }<br />  <wbr> <wbr> <wbr> 这个问题测试你是否懂得C语言中的整数自动转换原则，我发现有些开发者懂得极少这些东西。不管如何，这无符号整型问题的答案是输出是 ”&gt;6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数，所以该表达式 计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题，你也就到了得不到这份工作的边缘。</wbr></wbr></wbr></p><p>扩展一下，如果是这段代码呢？</p><p></p><div>void foo(void)<br /> {<br /> unsigned int a = 6;<br /> int b = -20;<br />printf("%d\n",a+b);<br /> (a+b &gt; 6) ? puts("&gt; 6") : puts("&lt;= 6");<br /> }</div>结果是输出：-14   &gt;6   <br /><p></p><p>为什么？我们要注意，在printf（）中，a+b也是转换为unsigned int（0xF2）的，但是%d要求又是按照有符号数输出，所以0xf2当成有符号数输出了-14。<br /></p><p>四。特别注意在有常数的算数表达式中，往往有隐含的数据类型转化，因为整数常量并没有明确的被指出其的数据类型，</p><p>整常数在不加特别说明时总是正值。如果需要的是负值，则负号“-”必须放置于常数表达式的前面。</p><p> 每个常数依其值要给出一种类型。当整常数应用于一表达式时，或出现有负号时，常数类型自动执行相应的转换，十进制常数可等价于带符号的整型或长整型，这取决于所需的常数的尺寸。</p><p> 八进制和十六进制常数可对应整型、无符号整型、长整型或无符号长整型，具体类型也取决于常数的大小。如果常数可用整型表示，则使用整型。如果常数值大于一 个整型所能表示的最大值，但又小于整型位数所能表示的最大数，则使用无符号整型。同理，如果一个常数比无符号整型所表示的值还大，则它为长整型。如果需 要，当然也可用无符号长整型。</p><p>但是，可以在一个常数后面加一个字母l或L强制其数据类型，则认为是长整型。如1 0 L、7 9 L、0 1 2 L、0 11 5 L、0 X A L、0 x 4 f L等。</p> L, U, LU,叫类型后缀,. <p><wbr> 一般在程序中出现3种数据.我把它们叫,变量,常量,字面量.<br /> 变量,常量一般都已经规定了类型了的,所以后缀针对的是字面量.<br /> 由于语言默认,整数是int型.即字面量 12 是 int型的.<br /> 如果要表示 长整型的12 就得加后缀 12L,无符号的 12U,无符号长整型的12UL.<br /> 具体这些有什么用,你需要了解整数在内存中的存放形式...存放长度(位)...</wbr></p></div><img src ="http://www.cppblog.com/wuzimian/aggbug/176482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wuzimian/" target="_blank">吴自勉</a> 2012-05-28 12:19 <a href="http://www.cppblog.com/wuzimian/archive/2012/05/28/176482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++之char , signed char , unsigned char，以及Integral Promotion</title><link>http://www.cppblog.com/wuzimian/archive/2012/05/28/176427.html</link><dc:creator>吴自勉</dc:creator><author>吴自勉</author><pubDate>Sun, 27 May 2012 17:49:00 GMT</pubDate><guid>http://www.cppblog.com/wuzimian/archive/2012/05/28/176427.html</guid><wfw:comment>http://www.cppblog.com/wuzimian/comments/176427.html</wfw:comment><comments>http://www.cppblog.com/wuzimian/archive/2012/05/28/176427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wuzimian/comments/commentRss/176427.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wuzimian/services/trackbacks/176427.html</trackback:ping><description><![CDATA[
		<div>
				<p>转载自：http://hi.baidu.com/nicker2010/item/591b02096c17ded6dce5b0eb</p>
				<p>
						<br />
				</p>
				<p>ANSI C 提供了3种字符类型，分别是char、signed char、unsigned char.而不是像short、int一样只有两种(int默认就是signed int).</p>
				<p>三者都占1个字节（1 byte），因此：</p>
				<p>signed char取值范围是 -128 到 127(有符号位)<br />unsigned char 取值范围是 0 到 255</p>
				<p>这个大家都很清楚！！</p>
				<p>但是char 呢？范围是多少？</p>
				<p>答案是：不一定！！！</p>
				<p>我们先看一下大师们怎么说的：</p>
				<p>（Thinking in C++ 2nd）：</p>
				<p>signed  is the default and is only necessary with char; char may or may not  default to signed. By specifying signed char, you force the sign bit to  be used. </p>
				<p>译文：有符号类型是默认（指的是对于其他整型如int等来说）的类型并且仅对于char来说才是必须的。char有可能 是signed也有可能是unsigned（我想这可能取决于编译器的具体实现）。但通过显式地指定一个char为signed，你就迫使其成为有符号的 字符型。</p>
				<p>
						<br />我的看法是：</p>
				<p>我们首先从这些类型的用处开始想起！</p>
				<p>char是用来声明字符的！</p>
				<p>而signed char和unsigned char是用来声明数值的，和int与unsigned int一样，只是其占据的空间少（这在手机等空间有限的嵌入式系统中尤其有效！），表示的范围有限。</p>
				<p>那么char在各个编译器中是怎样实现的？</p>
				<p>c标准中对此是 Implementation Defined，就是未明确定义，由具体的编译器明确定义。</p>
				<p>但是一般都是用signed char或unsigned char来实现char的，因为这三种类型的对象在存储介质中的表现形式是一样的（都是一个占8bit的01串，只是解析的时候不同）。</p>
				<p>至于到底是signed char还是unsigned char，各个编译器不同！！VC编译器、x86上的GCC都把char定义为signed char，而arm-linux-gcc却把char定义为 unsigned char.</p>
				<p>这样一来，在代码移植（困扰我们程序员的一个问题）上就会出现问题,举个最简单的例子：</p>
				<p>char a = 0xb6;</p>
				<p> if ( a == 0xb6) puts("hello world !");</p>
				<p>在vc 或 x86的gcc 上，都是不会打印出 hello world! 的。</p>
				<p>用 arm-linux-gcc 编译，在arm板上，是可以打印出hello world ! 的。</p>
				<p>我们再变化一下：</p>
				<p>char a = 0xb6;<br />short b = 0xb600;<br />int c = 0xb6000000;</p>
				<p>if ( a == 0xb6) puts("a");<br />if ( b == 0xb600) puts("b");<br />if ( c == 0xb6000000) puts("c"); </p>
				<p>在vc 或 x86的gcc 上，只会打印出 c 。用 arm-linux-gcc 编译，在arm板上，是可以打印出 a 和 c 。是不是发现了什么了呢？</p>
				<p>首 先，介绍 Integral Promotion（整数提升） 。通俗点说，c在处理整型（char short  int）时，都会自动提升为int（如果int范围不够，则提升成 unsigned int）。比如  “a ==  0xb6”，首先0xb6会当一个int来处理，变为0x000000b6（关于常量，后面还会仔细说明）。a 会提升为int ，假如 char  被定义为有符合的，那么 a 为负数，因为最高位为1，所以 a会提升为 0xffffffb6。假如 char 被定义为无符号的，那么a会提升为  0x000000b6 。</p>
				<p>即，在vc 或 x86的gcc 上，（a == 0xb6） 会变为 （0xffffffb6 == 0x000000b6） ，而在 arm-linux-gcc 上，变为（0x000000b6 == 0x000000b6）。 </p>
				<p>对于 short，因为c标准明确规定 不加关键字，就代表有符号数。所以，无论在什么编译器上 b == 0xb600 都会变成 0xffffb600 == 0x0000b600 。</p>
				<p>对于 int，本身是int，也就不用 Integral Promotion 了，所以  c == 0xb60000 中 ，c不做任何处理，直接从内存中读出来，即  0xb60000 == 0xb60000。</p>最 后，简单说一下常量。用八进制（0开头）或十六进制（0x开头）表示的常量，他们都会当成无符号数处理！ 另外 像 char a = 0xb6；  这句就有两个 Implementation Defined，一个是char带不带符号，另外一个是，假如char为有符号， 0xb6 会当int  0x000000b6 处理，把这个int 变为 有符号的 char  有溢出，会有问题，0xb6本为正数，赋值到a中却变为负数，具体要怎么处理，c对此也是 Implementation Defined。</div>
		<br />
		<br />1.<br />C++中内置数据类型分为两类：整数、浮点数。 对于不同的整数类型来说，比如int，unsigned int，有这么两句话：<br />int a=11；<br />unsigned int b=11；<br />我们可以看对应的汇编代码：<br /><div>00BC14FE  mov         dword ptr [a],0Bh  <br />00BC1505  mov         dword ptr [b],0Bh<br />我们不难发现，数据11（0x0B），在内存中，无论是int还是unsigned int，都是0x0B，存储是一样的，只是解析不同。 </div>2.<br />C++中的 Integral Promotion发生在算术表达式中（有运算符如+ ~等），其他情况下比如cout语句我要输出一个字符：  cout&lt;&lt;a；这个时候不会提升。<br />3.<br /><div>Integral Promotion反映在汇编上就是指令 movsx 和movzx。比如一个char型，提升时就会用movsx指令，unsigned char 提升时用movzx指令。<br />4.本文原作者说常量是无符号数，这种说法值得商榷，《C++ primer》中说过，20,024,0x14的类型是int或者long！！！我想原作者的意思是这样的：<br />int a=-1； 这句话执行的结果是 a里面存放着：0x FFFFFFFF，也就是-1对应的补码<br />int a=1  ;  这句话执行的结果是 a里面存放着：0x 00000001，也就是1对应的补码<br />int a=0xF7；这句话执行结果是 a里面存放着：0x 000000F7，a的低位放着F7，其他高位全部置为0；看起来像是oxF7是无符号数才会按0扩展，但事实上不是这个原因。<br />本质原因是汇编的mov指令：<br />mov ax，-1；其实汇编器最终会解释成：mov ax，FFFF<br />mov ax，F7H；其实汇编器最终会解释成： mov ax，00F7<br />所以需要注意：  常量-1,3,0xf4都是int或者long型的。<br />可以用下面代码小小测试：<br /><div>int a=-3;<br />cout&lt;&lt;a+0x1;<br />以及<br /><div>int a=-3;<br />cout&lt;&lt;a+0x1<span style="background-color: #ffcc00;">u;</span><br />运行一下，不难看出，0x1被当做int来处理，ox1u才是unsigned int型的。</div></div>比较好的参考资料：<br /><div>http://book.51cto.com/art/200912/166574.htm<br />这个网址里面对各种数据类型，以及整形提升，<strong>Usual Arithmetic Conversion做了非常详细的说明。</strong></div></div><img src ="http://www.cppblog.com/wuzimian/aggbug/176427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wuzimian/" target="_blank">吴自勉</a> 2012-05-28 01:49 <a href="http://www.cppblog.com/wuzimian/archive/2012/05/28/176427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++  cout</title><link>http://www.cppblog.com/wuzimian/archive/2012/05/24/176007.html</link><dc:creator>吴自勉</dc:creator><author>吴自勉</author><pubDate>Thu, 24 May 2012 05:36:00 GMT</pubDate><guid>http://www.cppblog.com/wuzimian/archive/2012/05/24/176007.html</guid><wfw:comment>http://www.cppblog.com/wuzimian/comments/176007.html</wfw:comment><comments>http://www.cppblog.com/wuzimian/archive/2012/05/24/176007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wuzimian/comments/commentRss/176007.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wuzimian/services/trackbacks/176007.html</trackback:ping><description><![CDATA[我们知道，c中的格式化输出printf（）存在默认类型转换的问题，而且有着严格的格式要求。<br />c++中做出的一个改进就是，采用了重载的方法，使用户更为方便的输出，常常采用cout。。。<br />用cout输出int，double等等没有问题，但是在输出char，char *的时候和输出int，double<br />还是有点不一样的。<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">  #include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />  </span><span style="color: #0000FF; ">using</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; "> std;<br />  </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> main()<br />  {<br />       </span><span style="color: #0000FF; ">char</span><span style="color: #000000; "> a</span><span style="color: #000000; ">=</span><span style="color: #000000; ">65</span><span style="color: #000000; ">;      <br />       </span><span style="color: #0000FF; ">char</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; ">aptr</span><span style="color: #000000; ">=&amp;</span><span style="color: #000000;">a;<br />       cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">a</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000;">endl;</span><span style="color: #000000; ">//正常输出   A</span><br /><span style="color: #000000; ">       cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">aptr</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000;">endl;</span><span style="color: #000000;">//输出  A烫烫   这是因为cout对于  char *类型的输出，会认为是用户要输出一个字符串，所以会连续输出，直到读到结束符。</span><br /><span style="color: #000000; ">       cout</span><span style="color: #000000; ">&lt;&lt;*</span><span style="color: #000000; ">aptr</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;//输出  A， 这和其他类型的指针解引用是一样的。<br />  }</span></div>但是，如果我们把a的值置为129,（129以上 asc||字符集中没有定义了）<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">  #include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />  </span><span style="color: #0000FF; ">using</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; "> std;<br />  </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> main()<br />  {<br />       </span><span style="color: #0000FF; ">char</span><span style="color: #000000; "> a</span><span style="color: #000000; ">=</span><span style="color: #000000; ">129</span><span style="color: #000000; ">;<br />       </span><span style="color: #0000FF; ">char</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; ">aptr</span><span style="color: #000000; ">=&amp;</span><span style="color: #000000; ">a;<br />       cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; "></span><span style="color: #000000; "></span><span style="color: #000000; "></span><span style="color: #000000; "></span><span style="color: #000000; ">a</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;//啥也不输出<br />       cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; "></span><span style="color: #000000; "></span><span style="color: #000000; "></span><span style="color: #000000; "></span><span style="color: #000000; ">aptr</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;//输出诡异乱码<br />       cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; "></span><span style="color: #000000; "></span><span style="color: #000000; "></span><span style="color: #000000; ">*</span><span style="color: #000000; ">aptr</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;//啥也不输出<br /><br />  }</span></div><br />所以说，我们在用cout的时候还是要有所注意。<br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/wuzimian/aggbug/176007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wuzimian/" target="_blank">吴自勉</a> 2012-05-24 13:36 <a href="http://www.cppblog.com/wuzimian/archive/2012/05/24/176007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员面试宝典中的一个错误  char * b=(char *)&amp;a</title><link>http://www.cppblog.com/wuzimian/archive/2012/05/23/175925.html</link><dc:creator>吴自勉</dc:creator><author>吴自勉</author><pubDate>Wed, 23 May 2012 12:23:00 GMT</pubDate><guid>http://www.cppblog.com/wuzimian/archive/2012/05/23/175925.html</guid><wfw:comment>http://www.cppblog.com/wuzimian/comments/175925.html</wfw:comment><comments>http://www.cppblog.com/wuzimian/archive/2012/05/23/175925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wuzimian/comments/commentRss/175925.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wuzimian/services/trackbacks/175925.html</trackback:ping><description><![CDATA[
		<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">
				<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
				<span style="color: #008080; "> 1</span> <span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; "> std;<br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> main()<br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">     unsigned </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> a </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0xFFFFFFF7</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">     unsigned </span><span style="color: #0000FF; ">char</span><span style="color: #000000; "> i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (unsigned </span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">)a;<br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; "> b </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a;<br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; "> <br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">    printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%08x, %08x\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, i, </span><span style="color: #000000; ">*</span><span style="color: #000000; ">b);<br /></span><span style="color: #008080; ">10</span> <span style="color: #000000;"> }</span></div>程序结果输出 ：fffffff7,《宝典》中解释为<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span> <span style="color: #000000; ">unsigned </span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">*</span><span style="color: #000000; "> p </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a; </span><span style="color: #008000; ">//</span><span style="color: #008000; "> p中的内容是的地址，即p指向a  </span><span style="color: #008000; "><br /></span><span style="color: #008080; ">2</span> <span style="color: #008000; "></span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; "> b </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)p; </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 此处的强制转换只是使b也指向a而已  <br /></span><span style="color: #008080; ">3</span> <span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000;"> 这里是char类型的指针转换，而不是char类型的转换，影响的只是指针的寻址 <br /></span></div>《宝典》认为最终b的指向和&amp;a一样，所以程序输出就是&amp;a指向的：fffffff7，这个解释显然是不对的，如果我们把a的值改为0x123456f7,程序也会输出fffffff7，<br />而按照《宝典》的说法，应该输出123456f7才对。<br />正确的解释是怎样的呢？<br />首先我们要有这么一个认识：在X86系列的机器中，数据的存储是“小端存储”，小端存储的意思就是，对于一个跨多个字节的数据，其低位存放在低地址单元，其高位放在高<br />地址单元。比如一个 int 型的数据ox12345678，假如存放在0x00000000,0x00000001,0x00000002,0x00000003这四个内存单元中，那么ox00000000中放的是<br />低位的ox78，而ox00000003中放的是高位的0x12，以此类推。<br />有了以上的认识，我们可以继续分析上面的程序为什么输出fffffff7：<br /><div><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; "> b </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000;">a;这句话到底干了什么事呢？其实说来也简单，&amp;a可以认为是个指向 unsigned int类型数据的指针对吧，（char *）&amp;a则把&amp;a强制转换成 char *类型<br />的指针，</span><span style="color: #000000; background-color: yellow;">并且这个时候发生了截断！</span><span style="color: #000000;">截断后，指针b只指向oxf7这个数据（为什么b指向最低位的oxf7而不是最高位的oxff？想想上面刚刚讲过的"小端存储"吧，低地址单元存<br />放低位数据，），又由于指针b是 char *型的，属于有符号数，所以有符号数0xf7在printf（）的作用下输出fffffff7( 这个过程中其实发生了参数类型提升default argument<br />promotions），因为我对C语言不是很了解，所以看这里，<div>http://www.spongeliu.com/%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A0/clanguage/ctypetransfer/</div>讲的比较清楚了。<br /></span></div><br />参考：<div>http://blog.csdn.net/race604/article/details/6725475<br /><br />或者我们可以通过汇编代码更直观的看内部的情况：<br /><div>int main()<br />  {<br />01321380  push        ebp  <br />01321381  mov         ebp,esp  <br />01321383  sub         esp,0E4h  <br />01321389  push        ebx  <br />0132138A  push        esi  <br />0132138B  push        edi  <br />0132138C  lea         edi,[ebp-0E4h]  <br />01321392  mov         ecx,39h  <br />01321397  mov         eax,0CCCCCCCCh  <br />0132139C  rep stos    dword ptr es:[edi]  <br />                unsigned int a = 0xFFFFFF65;<br />0132139E  mov         dword ptr [a],0FFFFFFF7h  <br />                unsigned char i = (unsigned char)a;<br />013213A5  mov         al,byte ptr [a]  <br />013213A8  mov         byte ptr [i],al  <br />                char* b = (char*)&amp;a;<br />013213AB  lea         eax,[a]                    //<span style="background-color: #ffff00;">取a的地址</span><span style="background-color: #ffff00;">：0x0018FD70</span><br />013213AE  mov         dword ptr [b],eax  //<span style="background-color: #ffff00;">指针b的值为：0x0018FD70，该位置放着0xF7；</span><br />  <br />                printf("%08x, %08x\n", i, *b);<br />013213B1  mov         eax,dword ptr [b]  //<span style="background-color: #ffff00;">把b的值，也就是0x0018FD70放到EAX中；</span><br />013213B4  movsx       ecx,byte ptr [eax]  //<span style="background-color: #ffff00;">这句话最关键，byte ptr [eax]就是把0xF7取出来，注意命令是</span><span style="background-color: #ff0000;">byte ptr</span><span style="background-color: #ffff00;">哦。然后movsx指令是按符号扩展，放到ecx中，按符号扩展其实就是将char扩展成int，然后printf中格式说明的‘x’则说明将这个int按16进制输出，也就是fffffff7了，而如果将‘x’变成‘d’，按整数输出，那么程序就会输出-9</span><br />013213B7  mov         esi,esp                   /<span style="background-color: #ffcc00;">/上一句的byte ptr 就反映了我们上面说的 char* b = (char*)&amp;a</span><span style="background-color: #ffcc00;"> 截取的问题</span><br />013213B9  push        ecx  <br />013213BA  movzx       edx,byte ptr [i]  <span style="background-color: #ffff00;">//注意因为i是unsigned char（无符号） ，所以按0扩展成unsigned int</span><br />013213BE  push        edx  <br />013213BF  push        offset string "%08x, %08x\n" (1325830h)  <br />013213C4  call        dword ptr [__imp__printf (13282B0h)]  <br />013213CA  add         esp,0Ch  <br />013213CD  cmp         esi,esp  <br />013213CF  call        @ILT+295(__RTC_CheckEsp) (132112Ch)  <br />  }</div></div><img src ="http://www.cppblog.com/wuzimian/aggbug/175925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wuzimian/" target="_blank">吴自勉</a> 2012-05-23 20:23 <a href="http://www.cppblog.com/wuzimian/archive/2012/05/23/175925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(int &amp;)a 和（int）a </title><link>http://www.cppblog.com/wuzimian/archive/2012/05/23/175902.html</link><dc:creator>吴自勉</dc:creator><author>吴自勉</author><pubDate>Wed, 23 May 2012 07:21:00 GMT</pubDate><guid>http://www.cppblog.com/wuzimian/archive/2012/05/23/175902.html</guid><wfw:comment>http://www.cppblog.com/wuzimian/comments/175902.html</wfw:comment><comments>http://www.cppblog.com/wuzimian/archive/2012/05/23/175902.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wuzimian/comments/commentRss/175902.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wuzimian/services/trackbacks/175902.html</trackback:ping><description><![CDATA[
		<div>
				<div bg_cpp"="">
						<div>
								<div>
										<strong>[cpp]</strong>
										<a href="http://blog.csdn.net/cszdhhz/article/details/6877333#" title="view plain">view plain</a>
										<a href="http://blog.csdn.net/cszdhhz/article/details/6877333#" title="copy">copy</a>
								</div>
						</div>
						<ol start="1">
								<li>
										<span>float a = 1.0f;   </span>
								</li>
								<li>  </li>
								<li>cout &lt; &lt; (<span>int)a &lt; &lt; endl;   </span></li>
								<li>  </li>
								<li>cout &lt; &lt; (<span>int&amp;)a &lt; &lt; endl;   </span></li>
								<li>  </li>
								<li>cout &lt; &lt; boolalpha &lt; &lt; ( (<span>int)a == (int&amp;)a ) &lt; &lt; endl; // 输出什么？   </span></li>
								<li>  </li>
								<li>
										<span>float b = 0.0f;   </span>
								</li>
								<li>  </li>
								<li>cout &lt; &lt; (<span>int)b &lt; &lt; endl;   </span></li>
								<li>  </li>
								<li>cout &lt; &lt; (<span>int&amp;)b &lt; &lt; endl;   </span></li>
								<li>  </li>
								<li>cout &lt; &lt; boolalpha &lt; &lt; ( (<span>int)b == (int&amp;)b ) &lt; &lt; endl; // 输出什么？   </span></li>
						</ol>
				</div>
				<p>
						<span style="font-size:9pt">
								<span style="font-family:Courier New; font-size:16px">输出啥？<span></span>不明白 (int &amp;)a是啥意识？为啥两个比较的出结果不同。 </span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="font-family:Courier New; font-size:16px">---------------------------------------------------- </span>
						</span>
				</p>
				<span style="font-size:9pt">
				</span>
				<div bg_cpp"="">
						<div>
								<div>
										<strong>[cpp]</strong>
										<a href="http://blog.csdn.net/cszdhhz/article/details/6877333#" title="view plain">view plain</a>
										<a href="http://blog.csdn.net/cszdhhz/article/details/6877333#" title="copy">copy</a>
								</div>
						</div>
						<ol start="1">
								<li>
										<span>cout &lt; &lt; boolalpha &lt; &lt; ( (int)a == (int&amp;)a ) &lt; &lt; endl;   </span>
								</li>
						</ol>
				</div>
				<p>
						<br />
						<span style="font-size:9pt">
								<span style="font-size:16px">
										<span style="font-family:Courier New">
												<span>// </span>
												<span style="background-color:yellow">输出 false, 因为<span> float </span>的 1 和 int 的 1 在内存里的表示不一样。</span>
												<span>
												</span>
										</span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="font-family:Courier New; font-size:16px">... </span>
						</span>
				</p>
				<span style="font-size:9pt">
						<span style="font-size:16px">
								<span style="font-family:Courier New">
								</span>
						</span>
				</span>
				<div bg_cpp"="">
						<div>
								<div>
										<strong>[cpp]</strong>
										<a href="http://blog.csdn.net/cszdhhz/article/details/6877333#" title="view plain">view plain</a>
										<a href="http://blog.csdn.net/cszdhhz/article/details/6877333#" title="copy">copy</a>
								</div>
						</div>
						<ol start="1">
								<li>
										<span>cout &lt; &lt; boolalpha &lt; &lt; ( (int)b == (int&amp;)b ) &lt; &lt; endl; // 输出 true   </span>
								</li>
						</ol>
				</div>
				<p>
						<br />
						<span style="font-size:9pt">
								<span style="font-size:16px">
										<span style="font-family:Courier New">
												<span>// </span>
												<span style="background-color:yellow">输出 true, 因为<span> float </span>的 0 和 int 的 0 在内存里的表示是一样的。</span>
												<span>
												</span>
										</span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="font-size:16px">
										<span style="font-family:Courier New">
												<span>(int &amp;)a </span>就表示 不管 a 是什么，我都当他是一个int变量。  </span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="font-size:16px">
										<span style="font-family:Courier New">从机器码的角度来说，变量a会被翻译成一个内存地址，<span>(int &amp;)a </span>就是说，这个内存地址里的内容它是一个整数。 </span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="font-family:Courier New">
										<span style="font-size:16px">
												<span>(int)a </span>呢不同：如果 a 不是整数，就会按规则转换成整数，存入另一个地址(或临时变量)中去。</span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="background-color:yellow">
										<span style="font-family:Courier New">
												<span style="font-size:16px">浮点数的<span> 1.0f </span>在内存里是这样表示的： </span>
										</span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="font-family:Courier New">
										<span style="font-size:16px">
												<span style="background-color:yellow">0011 1111 1000 0000 00000000 00000000</span>
										</span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="background-color:yellow">
										<span style="font-family:Courier New">
												<span style="font-size:16px">这个32位二进制数被当作整数输出就是：<span></span></span>
										</span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="font-family:Courier New">
										<span style="font-size:16px">
												<span style="background-color:yellow">1065353216</span>
										</span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="background-color:yellow">
										<span style="font-family:Courier New">
												<span style="font-size:16px">而整数的<span> 1 </span>在内存里是这样表示的： </span>
										</span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="font-family:Courier New">
										<span style="font-size:16px">
												<span style="background-color:yellow">0000 0000 0000 0000 00000000 00000001</span>
										</span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="font-family:Courier New">
										<span style="font-size:16px">所以<span> (int)a != (int&amp;)a </span></span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="background-color:yellow">
										<span style="font-family:Courier New">
												<span style="font-size:16px">浮点的0和整数的<span>0 </span>在内存里都是： </span>
										</span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="background-color:yellow">
										<span style="font-family:Courier New; font-size:16px">0000 0000 0000 0000 00000000 00000000 </span>
								</span>
						</span>
				</p>
				<p>
						<span style="font-size:9pt">
								<span style="font-family:Courier New">
										<span style="font-size:16px">
												<span style="background-color:yellow">所以 (int)b == (int&amp;)b</span>
										</span>
								</span>
						</span>
				</p>
				<div bg_cpp"="">
						<div>
								<div>
										<strong>[cpp]</strong>
										<a href="http://blog.csdn.net/cszdhhz/article/details/6877333#" title="view plain">view plain</a>
										<a href="http://blog.csdn.net/cszdhhz/article/details/6877333#" title="copy">copy</a>
								</div>
						</div>
						<ol start="1">
								<li>
										<span>&lt;span style="font-size:16px;"&gt;#include &lt;iostream&gt;   </span>
								</li>
								<li>  </li>
								<li>
										<span>#include &lt;stdio.h&gt;   </span>
								</li>
								<li>  </li>
								<li>
										<span>#include &lt;string.h&gt;   </span>
								</li>
								<li>  </li>
								<li>
										<span>#include &lt;conio.h&gt;   </span>
								</li>
								<li>  </li>
								<li>
										<span>using namespace std;   </span>
								</li>
								<li>  </li>
								<li>  </li>
								<li>
										<span>int main()   </span>
								</li>
								<li>  </li>
								<li>{   </li>
								<li>  </li>
								<li>
										<span>float a = 1.0f;   </span>
								</li>
								<li>  </li>
								<li>  </li>
								<li>cout &lt;&lt; <span>sizeof(int) &lt;&lt;endl;//4   </span></li>
								<li>  </li>
								<li>cout &lt;&lt; <span>sizeof(float) &lt;&lt;endl;//4   </span></li>
								<li>  </li>
								<li>  </li>
								<li>cout &lt;&lt; (<span>int)a &lt;&lt; endl;//1   </span></li>
								<li>  </li>
								<li>cout &lt;&lt; &amp;a &lt;&lt; endl; <span>/* 取a的地址十六进制0012FF7C*/   </span></li>
								<li>  </li>
								<li>cout &lt;&lt; (<span>int)&amp;a &lt;&lt; endl; /*(int)&amp;a:把a的地址强制转换成十进制的整型1245052*/   </span></li>
								<li>  </li>
								<li>cout &lt;&lt; (<span>int&amp;)a &lt;&lt; endl;&lt;/span&gt;   </span></li>
						</ol>
				</div>
				<br />
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">/*(int&amp;)a:将a的引用强制转换为整型,意思是a所在的内存，本来定义的时候为float类型,并初始为1.0f， </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">但现在我要按int类型解释这段内存（也就是说a所在的内存地址中的数据本来是按float型存储表示的，你非要按int型来解释不可）。 </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">1.0f 在内存中的存储为 <span style="background-color:yellow"> 0011 1111 1000 0000 0000 0000 0000 0000. </span>把他按整型数解释为2^29+2^28+2^27+2^26+2^25+2^24+2^23=1065353216 </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">(int&amp;)a 相当于*(int*)&amp;a ; *(int*)(&amp;a) ; *((int*)&amp;a) </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">*/ </span>
						</span>
				</p>
				<div bg_cpp"="">
						<div>
								<div>
										<strong>[cpp]</strong>
										<a href="http://blog.csdn.net/cszdhhz/article/details/6877333#" title="view plain">view plain</a>
										<a href="http://blog.csdn.net/cszdhhz/article/details/6877333#" title="copy">copy</a>
								</div>
						</div>
						<ol start="1">
								<li>
										<span>&lt;span style="font-size:16px;"&gt;cout &lt;&lt; boolalpha &lt;&lt; ((int)a == (int&amp;)a ) &lt;&lt; endl;// 输出false.因为1!=1065353216.   </span>
								</li>
								<li>  </li>
								<li>  </li>
								<li>
										<span>float b = 0.0f;   </span>
								</li>
								<li>  </li>
								<li>cout &lt;&lt; (<span>int)b &lt;&lt; endl;//0   </span></li>
								<li>  </li>
								<li>cout &lt;&lt; &amp;b &lt;&lt; endl;<span>/*取b的地址十六进制0012FF78*/   </span></li>
								<li>  </li>
								<li>cout &lt;&lt; (<span>int&amp;)b &lt;&lt; endl;//0   </span></li>
								<li>  </li>
								<li>cout &lt;&lt; boolalpha &lt;&lt; ((<span>int)b == (int&amp;)b ) &lt;&lt; endl;// 输出true,因为0==0;&lt;/span&gt;   </span></li>
						</ol>
				</div>
				<br />
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">/* </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">(int&amp;)a 不经过转换， 直接得到a在内存单元(就是地址)的值 </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">(int)a a在内存中的值转换成int类型 </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">float类型在内存中存储的形式是 ,符号位 指数 尾数 </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">由754标准:阶码采用增码(该数补码的反符号),尾数采用原码 </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">所以1.0f 在内存中的形式为 </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">0011 1111 1000 0000 0000 0000 0000 0000 </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">所以输出的是 0x3f800000 </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">0 在内存中的的存储形式 </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">0000 0000 0000 0000 0000 0000 0000 0000 </span>
						</span>
				</p>
				<p>
						<span style="font-size:10pt">
								<span style="font-size:16px">*/</span>
						</span>
				</p>
				<div>
						<div>
								<strong>[cpp]</strong>
								<a href="http://blog.csdn.net/cszdhhz/article/details/6877333#" title="view plain">view plain</a>
								<a href="http://blog.csdn.net/cszdhhz/article/details/6877333#" title="copy">copy</a>
						</div>
				</div>
				<ol start="1">
						<li>
								<span>&lt;span style="font-size:16px;"&gt;return 0;   </span>
						</li>
						<li>  </li>
						<li>}&lt;/span&gt;  <br /></li>
				</ol>
		</div>
<img src ="http://www.cppblog.com/wuzimian/aggbug/175902.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wuzimian/" target="_blank">吴自勉</a> 2012-05-23 15:21 <a href="http://www.cppblog.com/wuzimian/archive/2012/05/23/175902.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++中变量、变量名、变量地址、指针、引用等含义</title><link>http://www.cppblog.com/wuzimian/archive/2012/05/23/175899.html</link><dc:creator>吴自勉</dc:creator><author>吴自勉</author><pubDate>Wed, 23 May 2012 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/wuzimian/archive/2012/05/23/175899.html</guid><wfw:comment>http://www.cppblog.com/wuzimian/comments/175899.html</wfw:comment><comments>http://www.cppblog.com/wuzimian/archive/2012/05/23/175899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wuzimian/comments/commentRss/175899.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wuzimian/services/trackbacks/175899.html</trackback:ping><description><![CDATA[
		<br />
		<div>
				<p>
						<span style="font-size: 12pt;">首先了解内存，内存就是一排房间，编号从0开始，0,1,2,3,4,5......</span>
				</p>
				<p>
						<span style="font-size: 12pt;">房间里面一定要住人，新人住进去了，原来的人就走了；不管你住不住，里面都有人、</span>
				</p>
				<p>
						<span style="font-size: 12pt;">编号就是地址、里面的人就是内容，为了我们（人）记着方便，我们给他们起些名字，如张三、李四、于是，</span>
				</p>
				<p>
						<span style="font-size: 12pt;">变量，就是一个房间，它有编号（地址），他有名字（变量名），他有内容（里面的人）、</span>
				</p>
				<p>
						<span style="font-size: 12pt;">int a = 3;   // a 是名字，3 是内容，地址可以假设是0x 12345678 (通常就是32位地址)、</span>
				</p>
				<p>
						<span style="font-size: 12pt;">         // 0x12345678 这个房间里面住的是一个int，</span>
				</p>
				<p>
						<span style="font-size: 12pt;">
								<br />
						</span>
				</p>
				<p>
						<span style="font-size: 12pt;">所谓指针变量，就是一个房间，他里面的内容，可以放个地址；如</span>
				</p>
				<p>
						<span style="font-size: 12pt;">int *pi = &amp;a;   // pi 是名字，内容就是a的地址，0x12345678; 所以，你懂的，</span>
				</p>
				<p>
						<span style="font-size: 12pt;">            // 我们知道你家地址，你说，我能找到你吗？？于是</span>
				</p>
				<p>
						<span style="font-size: 12pt;">*pi = 4;          // 就是通过pi，也就是a 的地址，把a的内容改成4了、</span>
				</p>
				<p>
						<span style="font-size: 12pt;">pi 的类型int*, pi就是个指针（变量）、</span>
				</p>
				<p>
						<span style="font-size: 12pt;">好吧，变量的别名，就相当于外号，</span>
				</p>
				<p>
						<span style="font-size: 12pt;">int &amp; b = a;    // 同样的0x12345678 这个房间，刚才他有个名字a，现在又有个名字b了、</span>
				</p>
				<p>
						<span style="font-size: 12pt;">b = 10;          // 也就是 a = 10;</span>
				</p>
				<p>
						<span style="font-size: 12pt;">a = 100;        // 也就是 b = 100;</span>
				</p>
				<p>
						<span style="font-size: 12pt;">int&amp; 就是引用类型，int&amp;  b = a; </span>
				</p>
				<span style="font-size: 12pt;">意思，就是b是对a 引用，也就是b 是a 的别名、a就是b，b就是a<br /><br />其实，变量名字神马的都是浮云。<br />假设有一个整型变量（也就是int型），它放在内存0x0023F920中（其实是从0x0023F920~0x0023F923四个字节），<br />这个变量我声明的时候是这样的：int a=3；  那么我们可以知道：这个整型变量的地址是：0x0023F920，它的名字是a，<br />它的值是3，‘a’就是一个代号，一个名字，方便程序员书写程序，当编译器看到a时，看到a=10时，编译器就会把0x0023F920开始<br />的四个内存单元中的值改为10，仅此而已。所以无论是整型变量也好，指针变量也好，我们要把“变量名”和“变量”这两个概念区分开，<br />就像把“人的姓名”和“人本身”区分开一样。<br />此外，关于指针的类型，我们知道有int *，char *，double *等等。如果对一个int * 型的指针解引用，那么会连续读四个字节，如果<br />对一个char *型的指针解引用，则只会读一个字节，同样道理，double * 读八个字节，这是怎么实现的呢？其实反映在汇编代码上很简单。<br />比如有 int * a；b=*a；  对应汇编代码：  move acx，</span>
				<span style="font-size: 12pt; background-color: #ffff00;">dword ptr</span>
				<span style="font-size: 12pt;">[a]       move dword ptr[b]，acx<br /><div><span style="font-size: 12pt;"><br /></span></div></span>
		</div>
<img src ="http://www.cppblog.com/wuzimian/aggbug/175899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wuzimian/" target="_blank">吴自勉</a> 2012-05-23 15:18 <a href="http://www.cppblog.com/wuzimian/archive/2012/05/23/175899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>