printf("%d \n", -1 < sizeof(int) ) Implicit conversion
2014-04-14 20:15
393 查看
int i = -1; printf("%d \n", -1 < sizeof(int) ); 结果输出:[b] 0 [/b]
在写程序时,经常对于比较很随意,特别是类型不同时,然而这带来的错误也是意想不到,却理所当然。
剖析:
sizeof(int) 结果返回unsigned int ,值为4
i是int类型, int 与 unsigned int 比较,导致 i 隐式转换为 unsigned int
故最终比较 0xFFFFFFFF < 0x04 结果是0
隐式类型转换
算术转换
进行算术运算(加、减、乘、除、取余以及符号运算)时,不同类型数招必须转换成同 一类型的数据才能运算,算术转换原则为(1)整型提升:对于所有比int小的类型,包括char, signed char, unsigned char, short, unsigned short,首先会提升为int类型
(2)高于整型类型提升:
(3) 在进行运算时,以表达式中最长类型为主,将其他类型位据均转换成该类型。
(4) 有符号和无符号之间的转换,signed会转换为unsigned。 包含signed与unsigned int,如果int恰好为负数,其结果为对unsigned取值个数求模的结果。比如将-1赋给8位的unsigned char,呢么结果就是255(-1对256取模后的值)。unsigned char取值范围0~255。
赋值转换
进行赋值操作时,赋值运算符右边的数据类型必须转换成赋值号左边的类型,若右边的数据类型的长度大于左边,则要进行截断或舍入操作。输出转换
在程序中将数据用printf函数以指定格式输出时,当要输出的盐据类型与输出格式不符时,便自动进行类型转换,如一个long型数据用整型格式(%d)输出时,则相当于将long型转换成整型(int)数据输出;一个字符(char)型数据用整型格式输出时,相当于将char型转 换成int型输出。注意:较长型数据转换成短型数据输出时,其值不能超出短型数据允许的值范围,否则 转换时将出错。如:
long a=80000;
printf("%d",a);
运行结果为14464,因为int型允许的最大值为32767,80000超出此值,故结果取以32768为模的余数,即进行如下取余运算:
(80000-32768)-32768=14464;
输出的数据类型与输出格式不符时常常发生错误。
bool转换
如果不为0则真, 为0则假, Null(0) 为假。
相关文章推荐
- jQuery拖拽布局插件Portal
- 世纪末的星期
- WM_CTLCOLOR和OnCtlColor消息函数
- 寻找一个整数二进制表示中1的个数
- 杭电acm 1038题
- Linux下MySQL备份以及crontab定时备份
- Linux下MySQL备份以及crontab定时备份
- 初次使用boost 库
- Linux下MySQL备份以及crontab定时备份
- C# 心得
- nyoj17
- 在VS2010下如何使用头文件unistd.h
- ListBox 绑定之-SelectedItem
- Twitter.com在用哪些Javascript框架?
- C++中抽象类和接口类的区别
- Java中文件路径及其访问
- Android四大基本组件介绍与生命周期
- 【java】代理、包装
- 反转单词顺序
- Android Stagefright MPEG4Writer分析