(原创)关于C语言类型扩展的隐患
2012-04-03 12:10
267 查看
关于C语言类型扩展的问题,经常被大家忽略,因为这是一个很隐秘的问题,请看下文:
void func(void)
{
int i=1;
unsigned char c1 = 1;
signed char c2 = -1;
if(c2 > i)
dprintf("\r\n -1 > 1");
else
dprintf("\r\n -1 <= 1");
if(c2 > c1)
dprintf("\r\n -1 > 1");
else
dprintf("\r\n -1 <= 1");
}
实际运行结果会是多少呢?
-1 > 1
-1 > 1
这是问什么呢? 很明显-1<1, 难道是打印有问题吗?还是这是C的一个BUG? 其实这是自己留下的一个隐患。
谨记:在C语言中,当两种不同类型之间运算时,低字节长度类型会向高自己长度类型转换,有符号会向无符号类型转换。
拿上例来说,当C2与i进行比较时,由于C2是有符号8位,i是无符号32位(int长度与机器类型有关,在32位机器中,int表示为32位),根据C语言的规则,c2被转换成32位,即-1的补码,故会得出-1>1的结论。
而后面一个-1<1的情况就不用说了吗?根据C规则,c2转化成无符号8位整数,即255,255当然大于1了,所以大家就会明白为什么-1>1了吧!(注:打印出的信息并没有错,虽然完全误导了程序员,但是这些都是因为自己给自己留下来的隐患)。
看了这篇文章之后,以后再编写程序时我们是否都应该多留一个心眼呢? 哈哈
作者:tdyichen1314
(现从事LED行业,专注于户外大型LED显示屏控制系统的研发,希望与大家一起交流,共同进步)
邮箱:495567585@qq.com
td.logic@hotmail.com
void func(void)
{
int i=1;
unsigned char c1 = 1;
signed char c2 = -1;
if(c2 > i)
dprintf("\r\n -1 > 1");
else
dprintf("\r\n -1 <= 1");
if(c2 > c1)
dprintf("\r\n -1 > 1");
else
dprintf("\r\n -1 <= 1");
}
实际运行结果会是多少呢?
-1 > 1
-1 > 1
这是问什么呢? 很明显-1<1, 难道是打印有问题吗?还是这是C的一个BUG? 其实这是自己留下的一个隐患。
谨记:在C语言中,当两种不同类型之间运算时,低字节长度类型会向高自己长度类型转换,有符号会向无符号类型转换。
拿上例来说,当C2与i进行比较时,由于C2是有符号8位,i是无符号32位(int长度与机器类型有关,在32位机器中,int表示为32位),根据C语言的规则,c2被转换成32位,即-1的补码,故会得出-1>1的结论。
而后面一个-1<1的情况就不用说了吗?根据C规则,c2转化成无符号8位整数,即255,255当然大于1了,所以大家就会明白为什么-1>1了吧!(注:打印出的信息并没有错,虽然完全误导了程序员,但是这些都是因为自己给自己留下来的隐患)。
看了这篇文章之后,以后再编写程序时我们是否都应该多留一个心眼呢? 哈哈
作者:tdyichen1314
(现从事LED行业,专注于户外大型LED显示屏控制系统的研发,希望与大家一起交流,共同进步)
邮箱:495567585@qq.com
td.logic@hotmail.com
相关文章推荐
- 关于扩展运算符中i++和++i,以及基本类型和引用类型的综合应用
- 关于强弱,静动语言类型的思考
- 关于动态语言和静态语言、强类型定义语言和弱类型定义语言的概念区分
- 关于C语言数据类型的十个问题
- 关于Java的事件分派机制及两个可能的语言扩展
- 关于C语言数据类型选择的一个注意
- 关于语言的动态静态类型,强弱类型(c,c++,java,php等)
- 关于就《银行监管报表可扩展商业报告语言(XBRL)扩展分类标准(征求意见稿)》公开征求意见的公告
- 扩展:关于ES字符串类型(Text vs keyword)的选择
- XML(Extenxible Markup Language)可扩展标记语言,DTD(Document Type Definition)文档类型定义
- [原创]Scala学习:关于变量(val,var,类型推断)
- 学点 C 语言(13): 数据类型 - 整型、字符型和浮点型的扩展
- 关于语言的类型系统
- 关于语言类型系统
- 关于Java是强类型语言的相关解释
- 关于动态语言和静态语言、强类型定义语言和弱类型定义语言的概念区分
- 关于页面不包含"事件_Click"的定义 并且找不到可接受页面类型的第一个参数的扩展方法"事件_Click" 的解决方案
- 关于java中的datetime数据类型的加减计算(部分转载部分原创)
- 关于C#中this的一个用法----用于C#原始类型扩展方法
- 关于强类型语言和无(弱)类型语言——致编程入门者