﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-星光灿烂-随笔分类-C/C++</title><link>http://www.cppblog.com/agaric/category/4876.html</link><description>C元素</description><language>zh-cn</language><lastBuildDate>Sat, 24 May 2008 07:50:46 GMT</lastBuildDate><pubDate>Sat, 24 May 2008 07:50:46 GMT</pubDate><ttl>60</ttl><item><title>char 类型的符号</title><link>http://www.cppblog.com/agaric/archive/2007/08/09/29650.html</link><dc:creator>菌子</dc:creator><author>菌子</author><pubDate>Thu, 09 Aug 2007 09:00:00 GMT</pubDate><guid>http://www.cppblog.com/agaric/archive/2007/08/09/29650.html</guid><wfw:comment>http://www.cppblog.com/agaric/comments/29650.html</wfw:comment><comments>http://www.cppblog.com/agaric/archive/2007/08/09/29650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/agaric/comments/commentRss/29650.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/agaric/services/trackbacks/29650.html</trackback:ping><description><![CDATA[<p>&nbsp;<span style="font-size: 18pt;"></span><span>我们都知道，C语言中的基本数据类型都分为 有符号型，和无符号型， 分别用signed&nbsp; 和 unsigned 来表示。一般情况下， 对于有符号类型， 声明时可以省略掉前面的signed,&nbsp; int i 等价于 signed int i. 星星一直以为所有数据类型，在所有的情况都适用此省略规则，直到前两天在ADS上编译一段程序时遇到了一个&#8220;灵异的问题&#8220;:</span></p>
<p><span></span></p>
<p>定义了一个变量&nbsp; char ch = -5 ; 可以是编译器却给出了警告， 并且其后的代码中 if( ch &lt; 0 ) 结果为假！ 这段代码在vc上面编译是没有问题的。 后来在网上查了一些资料，原来是这样： 对于 char ch 这样的定义 C语言标准并没有强制规定它的是一个有符号数还是无符号数，不同的编译器可以有不同的实现。ADS 认为 char ch 是要定义一个无符号数即 unsigned ch = -5 ,所以会给警告，并且后续的代码工作不正常， 而vc默认 char 为 signed char, 所以没有问题。</p>
<br>
<pre><span><strong style="font-size: 18pt;">解决方法</strong></span></pre>
<h2 style="font-weight: bold; color: #000033;">1. 使用自己定义的数据类型， 在不同平台上只需要重新编译代码</h2>
<br>#if defined ( ADS )<br>typedef signed char CHAR;<br>#else<br>typedef char CHAR;<br>#endif<br><br>
<h2 style="color: #000033;">2. 修改编译器设置</h2>
VC可以使用 /J 指令将默认的char类型定义成 unsigned char<br>ADS 可以使用 --signed_chars 参数来将默认的 char 类型定义为 signed char<br><br><br>
<h2><span style="color: #000033;">3. 除非必要，不要使用 char 类型</span>。</h2>
<br><br><img src ="http://www.cppblog.com/agaric/aggbug/29650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/agaric/" target="_blank">菌子</a> 2007-08-09 17:00 <a href="http://www.cppblog.com/agaric/archive/2007/08/09/29650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>