﻿<?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++博客-chenglong7997-随笔分类-Traps</title><link>http://www.cppblog.com/chenglong7997/category/19519.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 20 Aug 2012 07:17:45 GMT</lastBuildDate><pubDate>Mon, 20 Aug 2012 07:17:45 GMT</pubDate><ttl>60</ttl><item><title>Signed to unsigned conversion in C - is it always safe? (from stackoverflow)</title><link>http://www.cppblog.com/chenglong7997/archive/2012/08/17/187437.html</link><dc:creator>Snape</dc:creator><author>Snape</author><pubDate>Thu, 16 Aug 2012 18:32:00 GMT</pubDate><guid>http://www.cppblog.com/chenglong7997/archive/2012/08/17/187437.html</guid><wfw:comment>http://www.cppblog.com/chenglong7997/comments/187437.html</wfw:comment><comments>http://www.cppblog.com/chenglong7997/archive/2012/08/17/187437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chenglong7997/comments/commentRss/187437.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chenglong7997/services/trackbacks/187437.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px; ">Suppose I have the following C code.</p><pre prettyprint"="" style="margin-top: 0px; margin-bottom: 10px; padding: 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow: auto; width: auto; max-height: 600px; line-height: 18px; "><code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; "><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">unsigned</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">int</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "> u </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">=</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #800000; ">1234</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br /></span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">int</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "> i </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">=</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">-</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #800000; ">5678</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br /><br /></span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">unsigned</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">int</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "> result </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">=</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "> u </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">+</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "> i</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br /></span></code></pre><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px; ">What implicit conversions are going on here, and is this code safe for all values of&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">u</code>&nbsp;and&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">i</code>? (Safe, in the sense that even though&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">result</em>&nbsp;in this example will overflow to some huge positive number, I could cast it back to an&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">int</em>&nbsp;and get the real result.)<br /><br />Answer:<br /><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; word-wrap: break-word; "><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">Short Answer</strong></p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; word-wrap: break-word; ">Your&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">i</code>&nbsp;will be&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">converted</em>&nbsp;to an unsigned integer by adding&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">UINT_MAX + 1</code>, then the addition will be carried out with the unsigned values, resulting in a large&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">result</code>&nbsp;(depending on the values of&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">u</code>&nbsp;and<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">i</code>).</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; word-wrap: break-word; "><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">Long Answer</strong></p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; word-wrap: break-word; ">According to the C99 Standard:</p><blockquote style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 10px; padding-bottom: 1px; border: 0px; vertical-align: baseline; background-color: #eeeeee; quotes: none; color: #000000; "><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; clear: both; word-wrap: break-word; ">6.3.1.8 Usual arithmetic conversions</p><ol style="margin: 0px 0px 1em 30px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; list-style-position: initial; list-style-image: initial; "><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; word-wrap: break-word; ">If both operands have the same type, then no further conversion is needed.</li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; word-wrap: break-word; ">Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank is converted to the type of the operand with greater rank.</li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; word-wrap: break-word; ">Otherwise, if the operand that has unsigned integer type has rank greater or equal to the rank of the type of the other operand, then the operand with signed integer type is converted to the type of the operand with unsigned integer type.</li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; word-wrap: break-word; ">Otherwise, if the type of the operand with signed integer type can represent all of the values of the type of the operand with unsigned integer type, then the operand with unsigned integer type is converted to the type of the operand with signed integer type.</li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; word-wrap: break-word; ">Otherwise, both operands are converted to the unsigned integer type corresponding to the type of the operand with signed integer type.</li></ol></blockquote><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; word-wrap: break-word; ">In your case, we have one unsigned int (<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">u</code>) and signed int (<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">i</code>). Referring to (3) above, since both operands have the same rank, your&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">i</code>&nbsp;will need to be&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">converted</em>&nbsp;to an unsigned integer.</p><blockquote style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 10px; padding-bottom: 1px; border: 0px; vertical-align: baseline; background-color: #eeeeee; quotes: none; color: #000000; "><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; clear: both; word-wrap: break-word; ">6.3.1.3 Signed and unsigned integers</p><ol style="margin: 0px 0px 1em 30px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; list-style-position: initial; list-style-image: initial; "><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; word-wrap: break-word; ">When a value with integer type is converted to another integer type other than _Bool, if the value can be represented by the new type, it is unchanged.</li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; word-wrap: break-word; ">Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type.</li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; word-wrap: break-word; ">Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.</li></ol></blockquote><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; word-wrap: break-word; ">Now we need to refer to (2) above. Your&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">i</code>&nbsp;will be converted to an unsigned value by adding&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">UINT_MAX + 1</code>. So the result will depend on how&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">UINT_MAX</code>&nbsp;is defined on your implementation. It will be large, but it will not overflow, because:<blockquote style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 10px; padding-bottom: 1px; border: 0px; vertical-align: baseline; background-color: #eeeeee; quotes: none; color: #000000; "><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; clear: both; word-wrap: break-word; ">6.2.5 (9)</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; clear: both; word-wrap: break-word; ">A computation involving unsigned operands can never overflow, because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting type.</p></blockquote><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; word-wrap: break-word; "><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">Bonus: Arithmetic Conversion Semi-WTF</strong></p><pre prettyprint"="" style="margin-top: 0px; margin-bottom: 10px; padding: 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow: auto; width: auto; max-height: 600px; "><code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; "><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray; ">#include</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #800000; ">&lt;stdio.h&gt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br /><br /></span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">int</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "> main</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">(</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">void</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">)</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br /></span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">{</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br />&nbsp; </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">unsigned</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">int</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "> plus_one </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">=</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #800000; ">1</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br />&nbsp; </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">int</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "> minus_one </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">=</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">-</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #800000; ">1</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br /><br />&nbsp; </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">if</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">(</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">plus_one </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">&lt;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "> minus_one</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">)</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br />&nbsp; &nbsp; printf</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">(</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #800000; ">"1 &lt; -1"</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">);</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br />&nbsp; </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">else</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br />&nbsp; &nbsp; printf</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">(</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #800000; ">"boring"</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">);</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br /><br />&nbsp; </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">return</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #800000; ">0</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">;</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br /></span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">}</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br /></span></code></pre><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; word-wrap: break-word; ">You can use this link to try this online:&nbsp;<a href="http://codepad.org/yPhYCMFO" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #4a6b82; text-decoration: none; cursor: pointer; ">http://codepad.org/yPhYCMFO</a></p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; word-wrap: break-word; "><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">Bonus: Arithmetic Conversion Side Effect</strong></p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; word-wrap: break-word; ">Arithmetic conversion rules can be used to get the value of&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">UINT_MAX</code>&nbsp;by initializing an unsigned value to&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">-1</code>, ie:</p><pre prettyprint"="" style="margin-top: 0px; margin-bottom: 10px; padding: 5px; border: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow: auto; width: auto; max-height: 600px; "><code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; "><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">unsigned</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #00008b; ">int</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "> umax </span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">=</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">-</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #800000; ">1</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; ">;</span> <span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: gray; ">// umax set to UINT_MAX</span><span style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; "><br /></span></code></pre><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; word-wrap: break-word; ">This is guaranteed to be portable regardless of the signed number representation of the system because of the conversion rules described above. See this SO question for more information:&nbsp;<a href="http://stackoverflow.com/questions/809227/is-it-safe-to-use-1-to-set-all-bits-to-true" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #4a6b82; text-decoration: none; cursor: pointer; ">Is it safe to use -1 to set all bits to true?</a></p></p></p><img src ="http://www.cppblog.com/chenglong7997/aggbug/187437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chenglong7997/" target="_blank">Snape</a> 2012-08-17 02:32 <a href="http://www.cppblog.com/chenglong7997/archive/2012/08/17/187437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>chapter 7(可移植性缺陷)</title><link>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180117.html</link><dc:creator>Snape</dc:creator><author>Snape</author><pubDate>Sun, 24 Jun 2012 23:10:00 GMT</pubDate><guid>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180117.html</guid><wfw:comment>http://www.cppblog.com/chenglong7997/comments/180117.html</wfw:comment><comments>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chenglong7997/comments/commentRss/180117.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chenglong7997/services/trackbacks/180117.html</trackback:ping><description><![CDATA[1.标示符名称的限制<br /><br />ANSI C标准只保证了C实现必须能够<span style="color: red; ">区别出前6个字符不同的</span>外部名称。而且这个定义中并<span style="color: red; ">没有区分大写字母与其对应的小写字母。</span><br />因此，编写可移植程序必须小心这一点。<br /><br />2.字符是有符号的整数，还是无符号的整数<br />只有把一个字符值转换<span style="color: red; ">为一个较大的整数</span>时，才重要。在其他情况下，结果都是：多余的位被简单的&#8220;丢弃&#8221;。<br /><br />在转换过程中：应该将字符作为有符号数还是无符号数？<br />如果有符号，编译器将char数据，扩展到int时候，应该复制符号位。<br />如果无符号，编译器只需在多余的位上填充0.<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 />-->#include&nbsp;&lt;stdio.h&gt;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;c='a';<br />&nbsp;&nbsp;&nbsp;&nbsp;c=c+40;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf("%c\n",&nbsp;-1);&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;printf("c&nbsp;%d\n",&nbsp;c);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("unsigned&nbsp;c&nbsp;%u\n",&nbsp;(unsigned&nbsp;<span style="color: #0000FF; ">char</span>)c);<br />}</div>结果：<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 />-->c&nbsp;-119<br />unsigned&nbsp;c&nbsp;137</div>说明在gcc中，将char当做有符号数。在c+40的时候，超过了-128~127范围，因此溢出。如果是无符号char，范围是0~255.应该是输出137.<br /><br />如果编程者关注一个最高位是1的字符是正还是负，可以设置<span style="color: red; ">为无符号字符数</span>。这样所有编译器都会转换为整数时候，填充为0.<br /><br /><br />3.一个常见错误是：如果c是一个字符变量，使用（unsigned）c可以得到与c等价的无符号整数。<span style="color: red; ">这是会失败的</span>。因为在将c转换为无符号整数时候，c将首先首先被转换为int型整数。而此时可能得到非预期的结果。<br /><span style="color: red; ">正确方法是</span>：(unsigned char )c，直接进行转换。<br /><br />例如上个例子中，最后一句改为:<br /><div>printf("unsigned c %u\n", (unsigned )c);</div><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 />-->c&nbsp;-119<br />unsigned&nbsp;c&nbsp;4294967177</div>c被先转换为int型-119，再求他的无符号表达形式，<span style="font-size: 13px; background-color: #eeeeee; ">4294967177</span>&nbsp;<br /><br />4.移位运算符<br />&nbsp;&nbsp;&nbsp;1.向右移位时，空出的位由0填充，还是由符号位的副本填充。<br />&nbsp; &nbsp;2.如果是无符号数，用0填充。如果是有符号数，既可以用0也可以用符号位的副本。（如果关注右移时候空出的位，可以声明为无符号类型，那么空出的位都会被设置为0）<br /><br />&nbsp; &nbsp;如果被移位对象为n位，那么移位计数<span style="color: red; ">必须大于或等于0，而严格小于n.</span><br />即使C实现将符号位复制到空出的位中，有符号数的向右移位，<span style="color: red; ">也并不等于除以2的某次幂</span>。例如（-1）&gt;&gt;1结果为-1，而不是-1/2 == 0<br /><br />5.随机数最大值，RAND_MAX在limits中定义。我测试结果等于INT_MAX<br /><br />6.除法运算的截断<br />q=a/b;<br />r=a%b;<br />假定b&gt;0.<br /><span style="color: red; ">C语言定义只保证q*b+r=a,以及a&gt;=0 且 b&gt;0时，保证|r|&lt;|b|以及r&gt;=0.</span><br />（如果a&lt;0, 那么<span style="color: red; ">r也可能小于0）</span><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: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Start&nbsp;typing&nbsp;your&nbsp;code&nbsp;here<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;(-3)/2&lt;&lt;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div>结果商为-1，余数也为-1<br /><img src ="http://www.cppblog.com/chenglong7997/aggbug/180117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chenglong7997/" target="_blank">Snape</a> 2012-06-25 07:10 <a href="http://www.cppblog.com/chenglong7997/archive/2012/06/25/180117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>chapter 6（预处理器）</title><link>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180104.html</link><dc:creator>Snape</dc:creator><author>Snape</author><pubDate>Sun, 24 Jun 2012 18:26:00 GMT</pubDate><guid>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180104.html</guid><wfw:comment>http://www.cppblog.com/chenglong7997/comments/180104.html</wfw:comment><comments>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chenglong7997/comments/commentRss/180104.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chenglong7997/services/trackbacks/180104.html</trackback:ping><description><![CDATA[使用预处理器的两个主要原因：<br />１.一次修改变量，出现的所有的值都会修改。<br />讲所有常量定义集中在一起。<br /><br />２.避免函数调用开销。<br /><br />3.宏定义注意点<br />&nbsp; &nbsp; 1.不能忽视定义中的空格<br />&nbsp; &nbsp; 2.最好将宏定义中每个参数都用括号括起来。整个表达式的结果页用括号括起来。<br />&nbsp; &nbsp; 3.确保调用宏的参数中，不存在有副作用的代码<br /><br />4.assert宏。可以在出错信息中包含文件名和断言失败处的行号。很有用。<br /><br />5.宏并不是类型定义。<br />#define T1 struct foo *<br />typedef struct foo * T2;<br />T1 a,b; //struct foo * a, b;<br />T2 a,b; //a ,b都是指向结构的指针。<img src ="http://www.cppblog.com/chenglong7997/aggbug/180104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chenglong7997/" target="_blank">Snape</a> 2012-06-25 02:26 <a href="http://www.cppblog.com/chenglong7997/archive/2012/06/25/180104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>chapter 5</title><link>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180103.html</link><dc:creator>Snape</dc:creator><author>Snape</author><pubDate>Sun, 24 Jun 2012 18:10:00 GMT</pubDate><guid>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180103.html</guid><wfw:comment>http://www.cppblog.com/chenglong7997/comments/180103.html</wfw:comment><comments>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chenglong7997/comments/commentRss/180103.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chenglong7997/services/trackbacks/180103.html</trackback:ping><description><![CDATA[1.getchar<br /><img src="http://www.cppblog.com/images/cppblog_com/chenglong7997/Snap5.jpg" width="764" height="304" alt="" /><br />getchar返回整形<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 />-->#include&nbsp;&lt;stdio.h&gt;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(&nbsp;(c=getchar())!=EOF&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar(c);<br />}</div><br />应该将c声明为int。否则，c可能无法容下EOF<br /><br />2.更新文件<br />读操作之后，文件指针会偏移一段。这时候，讲文件更新后，写入源文件之前，应该fseek讲文件指针调回去。<br /><br />3.使用setbuf设置输出的缓冲区大小。可以是stdout和file<br /><br />4.正确使用errno检测错误<br />errno=0;<br />/*调用库函数*/<br />if(返回的错误值) &nbsp; //这个错误值可能不是由当前这个函数引起的。而是由当前函数，又调用的另外一个函数引起的。<br />&nbsp; &nbsp;检查errno;<br /><br />5.signal处理函数唯一安全，可移植的操作就是打印一条错误信息，然后使用longjmp或者exit立即退出程序。<br /><img src ="http://www.cppblog.com/chenglong7997/aggbug/180103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chenglong7997/" target="_blank">Snape</a> 2012-06-25 02:10 <a href="http://www.cppblog.com/chenglong7997/archive/2012/06/25/180103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>chapter 4</title><link>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180101.html</link><dc:creator>Snape</dc:creator><author>Snape</author><pubDate>Sun, 24 Jun 2012 17:41:00 GMT</pubDate><guid>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180101.html</guid><wfw:comment>http://www.cppblog.com/chenglong7997/comments/180101.html</wfw:comment><comments>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chenglong7997/comments/commentRss/180101.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chenglong7997/services/trackbacks/180101.html</trackback:ping><description><![CDATA[1.如果一个函数仅仅被同一个源文件中的其他函数调用，我们就应该声明该函数为static<br /><br />2.extern int n;<br />在两外一个文件中： long n；<br />这是一个无效的程序，因为同一个外部变量名在两个不同的文件中被声明为不同的类型。然后大多数c语言实现不能检测出这种错误。<br /><br />3.一个程序由多个模块组成，每个模块都需要知道一个特定的文件名。我们希望能够做到只在一处改动这个文件名，所有模块中的文件名就能同时得到更新。<br />可以，先创建一个文件，叫做file.h，它包含了声明<span style="color: red; ">extern char filename[];</span><br />需要用到外部对象filename的每个c源文件都应该加上： #include "file.h"；<br />最后选择一个C源文件，在其中给出filename的初始值。如在file.c中<br />#include "file.h";<br />char filename[]="/etc/passwd";<br /><br />这样就保证了filename的类型是正确的。解决了2中的问题。<img src ="http://www.cppblog.com/chenglong7997/aggbug/180101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chenglong7997/" target="_blank">Snape</a> 2012-06-25 01:41 <a href="http://www.cppblog.com/chenglong7997/archive/2012/06/25/180101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 整数溢出</title><link>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180099.html</link><dc:creator>Snape</dc:creator><author>Snape</author><pubDate>Sun, 24 Jun 2012 17:15:00 GMT</pubDate><guid>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180099.html</guid><wfw:comment>http://www.cppblog.com/chenglong7997/comments/180099.html</wfw:comment><comments>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chenglong7997/comments/commentRss/180099.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chenglong7997/services/trackbacks/180099.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">&nbsp;整数溢出<br />c语言中存在两类整数算术运算，有符号运算和无符号运算。<span style="color: #ff00ff; ">在无符号运算里，没有了符号位，所以是没有溢出的概念的</span>。</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">所有的无符号<span style="color: red; ">运算都是以2的n次方为模</span>。如果算术运算符的一个操作数是有符号书，另一个是无符号数，那么有符号数</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">会被<span style="color: red; ">转换为无符号数</span>(表示范围小的总是被转换为表示范围大的)，那么溢出也不会发生。但是，当两个操作数都是有符号数</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">时，溢出就有可能发生。而且溢出的结果是未定义的。<span style="color: red; ">当一个运算的结果发生溢出时，任何假设都是不安全的。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">例如，假定a和b是两个非负的整型变量(有符号)，我们需要检查a+b是否溢出，一种想当然的方式是:</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">if (a + b &lt; 0)</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 溢出；</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">实际上，在现实世界里，这并不能正常运行。当a+b确实发生溢出时，所有关于结果如何的假设均不可靠。比如，在某些</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">机器的cpu，加法运算将设置一个内部寄存器为四种状态:正，负，零和溢出。在这种机器上，c编译器完全有理由实现以上</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">的例子，使得a+b返回的不是负，而是这个内存寄存器的溢出状态。显然，if的判断会失败。</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">一种正确的方式是将a和b都强制转换为无符号整数：</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">if ( (unsigned)a + (unsigned)b&nbsp; &gt; INT_MAX)</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 溢出;</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">这里的int_max值为有符号整型的最大值。在一般的编译器里是一个预定义的常量。ANSI C在limits里定义了INT_MAX，值为</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">2的31次方-1.</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">不需要用到无符号算数运算的另一种可行方法是：</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">if (a &gt; INT_MAX - b )</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp; 溢出；&nbsp;</p><img src ="http://www.cppblog.com/chenglong7997/aggbug/180099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chenglong7997/" target="_blank">Snape</a> 2012-06-25 01:15 <a href="http://www.cppblog.com/chenglong7997/archive/2012/06/25/180099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于判断无符号整数想加溢出（转闲人草堂）</title><link>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180098.html</link><dc:creator>Snape</dc:creator><author>Snape</author><pubDate>Sun, 24 Jun 2012 17:11:00 GMT</pubDate><guid>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180098.html</guid><wfw:comment>http://www.cppblog.com/chenglong7997/comments/180098.html</wfw:comment><comments>http://www.cppblog.com/chenglong7997/archive/2012/06/25/180098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chenglong7997/comments/commentRss/180098.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chenglong7997/services/trackbacks/180098.html</trackback:ping><description><![CDATA[<br /><img src="http://www.cppblog.com/images/cppblog_com/chenglong7997/Snap4.jpg" width="1109" height="1564" alt="" /><img src ="http://www.cppblog.com/chenglong7997/aggbug/180098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chenglong7997/" target="_blank">Snape</a> 2012-06-25 01:11 <a href="http://www.cppblog.com/chenglong7997/archive/2012/06/25/180098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>chapter 3(语义陷阱)</title><link>http://www.cppblog.com/chenglong7997/archive/2012/06/24/180081.html</link><dc:creator>Snape</dc:creator><author>Snape</author><pubDate>Sun, 24 Jun 2012 15:53:00 GMT</pubDate><guid>http://www.cppblog.com/chenglong7997/archive/2012/06/24/180081.html</guid><wfw:comment>http://www.cppblog.com/chenglong7997/comments/180081.html</wfw:comment><comments>http://www.cppblog.com/chenglong7997/archive/2012/06/24/180081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chenglong7997/comments/commentRss/180081.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chenglong7997/services/trackbacks/180081.html</trackback:ping><description><![CDATA[1.int a[10]; 除了a被用作运算符<span style="color: red; ">sizeof()的参数这一情况</span>，在其他所有的情形中，数组名a都代表指向数组<span style="color: red; ">a中下标为0的元素的指针。</span><br />因此，int *p=a; //right<br /> int &nbsp;*p=&amp;a; //error, (&amp;a已经是一个指向整个数组的指针)<br /><br />2.为main函数提供返回值<br />main（）<br />{}<br />隐含着main返回整数，<span style="color: red; ">一个返回整数的函数如果返回失败，实际上隐含返回某个&#8220;垃圾&#8221;整数</span>，只要该值不被用到，就无关紧要。<br />然而，在某些情况下，main的返回值却并非无关紧要，大多数C语言实现通过main的返回值，<span style="color: red; ">来告知操作系统该函数的执行是成功还是失</span><span style="color: red; ">败</span>。如果一个程序的main函数并不返回任何值，那么<span style="color: red; ">有可能看上去执行失败</span><span>。所以最好提供返回值<br /><br />3.边界计算与不对称边界。<br />适合c中以下标为0开始的计算。</span><img src ="http://www.cppblog.com/chenglong7997/aggbug/180081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chenglong7997/" target="_blank">Snape</a> 2012-06-24 23:53 <a href="http://www.cppblog.com/chenglong7997/archive/2012/06/24/180081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>chapter 1</title><link>http://www.cppblog.com/chenglong7997/archive/2012/06/23/179858.html</link><dc:creator>Snape</dc:creator><author>Snape</author><pubDate>Fri, 22 Jun 2012 22:21:00 GMT</pubDate><guid>http://www.cppblog.com/chenglong7997/archive/2012/06/23/179858.html</guid><wfw:comment>http://www.cppblog.com/chenglong7997/comments/179858.html</wfw:comment><comments>http://www.cppblog.com/chenglong7997/archive/2012/06/23/179858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chenglong7997/comments/commentRss/179858.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chenglong7997/services/trackbacks/179858.html</trackback:ping><description><![CDATA[1.y=x/*p; &nbsp; //p指向除数<br />error.<br />/*会被当做注释的开始。应该y=x / *p;<br />或者y = x/(*p);&nbsp;<br /><br />2.如果一个整形常量第一个字符为数字0.那么这个常量会被当做8进制数。<img src ="http://www.cppblog.com/chenglong7997/aggbug/179858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chenglong7997/" target="_blank">Snape</a> 2012-06-23 06:21 <a href="http://www.cppblog.com/chenglong7997/archive/2012/06/23/179858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>