RSS订阅信息安全技术跟踪与研究:技术、平台、会议、论文、产业
你现在的位置:首页 / 技术积累 / 正文

C编程警戒:慎用char

0 技术积累 | 2015年7月2日
转载申明:本站原创,欢迎转载。但转载时请保留原文地址。
原文地址:http://www.vonwei.com/post/notusedchar.html

代码里char c;这样的定义很少有人会留意,可就是这么个简单的定义却有很大的隐患。所有C原始类型中,char比较特殊,其他如long, int, short都默认有符号,相当于signed long, signed intsigned short,只有“char”不确定。某些编译器默认char是有符号的signed char,有些又当作unsigned char处理。例如ARM编译器ADS中,有编译选项(plain char is signed),选定此选项,ADS就把char当作signed char,不选定就默认unsigned char。不同的编译器选项会导致某些程序运行结果完全不同

  

  比如:

    char c = -1;

    if(c>=0)    ......

    考虑下,如果编译器把char c认为是signed char c,那c = -1没问题。但如果是unsigned char c,那c = -1赋值后,c实际等于多少?c>=0是否成立呢?

    所以直接用char而不明确指明signedunsigned是危险的,可能因有符号和无符号的“意外”转换而发生错误。保险做法是用typedef定义新类型,明确指明符号,如:  #typedef   unsigned char  u8          #typedef   signed char     s8   。然后程序中不直接用char,而用明确制定signed和unsigned的新类型来定义变量,这就消除了char的默认符号带来的问题。

from:http://blog.csdn.net/ipmux/article/details/17332859


在跨平台开发时,尤其注意了

如果用char,当其被有些编译器当作signed ,其取值范围是-128-127;

而被有些编译器当作unsigned,其取值为0-255;

当出现-1时,在内存中十六进制可能都是0xFF,但是识别的数值却不一样,前者识别为-1(最高位当作符号位了),而后者识别为255了。


  • ------------------分隔线----------------

  • 如果感兴趣,欢迎关注本站微信号,跟踪最新博文信息,手机微信扫一扫下面的二维码,即可关注!
  • 微月信公众号
  • 推荐您阅读更多有关于“ C语言   ”的文章

    请填写你的在线分享代码
    上一篇:CPU的一些概念区分:core, die, package, physical, logic下一篇:[转]U-Boot on BeagleBone Black

    猜你喜欢

    评论列表:

    发表评论

    必填

    选填

    选填

    必填,不填不让过哦,嘻嘻。

    记住我,下次回复时不用重新输入个人信息

    本站介绍
    最近发表
    本年最热文章
    本月最热文章
    网站分类
    文章归档