c 整型提升和算数转换
来源:互联网 发布:野火微博软件 编辑:程序博客网 时间:2024/05/17 06:51
相关概念说明:
1:整型提升
如果char、short int或者int型位段(bit-field),包括它们有符号或无符号变型,以及枚举类型,可以使用在需要int或者unsigned int的表达式中。如果int可以完整表示源类型的所有值,那么该源类型的值就转换为int,否则转换为unsigned int。这称为整型提升。
2:寻常算术转换
许多操作数类型为算术类型的双目运算符会引发转换,并以类似的方式产生结果类型。它的目的的产生一个普通类型,同时也是运算结果的类型。这个模式成为“寻常算术转换”。
当两个类型长度不同时,短的类型根据自己是正数还是负数进行位扩展,然后按较长的类型解释signed或unsigned。因为短类型向长类型扩展后无论解释成什么类型都不会丢失信息,而长类型本身为unsigned,若解释为signed肯定要丢失信息,所以要以长类型为准解释signed或者unsigned。
说明:虽然32位下long和int都是4个字节,但是int要向long转(可以当做long比int长)。
当两个类型长度相同,signed类型不同时(比如int和unsigned int),按照unsigned解释(即都转为unsigned)。因为两个同为类型相同,unsigned的转为signed肯定要丢失高位信息。
说明:这里不包括char,unsigned char,short,unsigned short,因为这些在一起会发生整形提升(扩展后,解释为signed int)。
--------------------------------------------------------------------------------------------从博客lvyilong316转载,按自己的理解修改了一部分--------------------------------------------------------------
以程序为例说明整型提升和算数转换:
void main()
{
chara = -1;
unsignedchar b = -1;
printf("%u\n",a);
printf("%u\n",b);
printf("%d\n",a>b);
printf("%d\n",a>(unsigned int)b);
printf("%d\n",(unsigned int)a>b);
}
1:在机器中以补码形式存储。
a 是一个负数,表示为 0xff;(8位)
b是一个无符号数,所以-1被解释为 0xff(正数)
当进行比较的时候,整型提升(扩展后,解释为signed int),由于计算机中数值一律用补码表示。位拓展时(32位机器)
a的拓展位添1, 为 0xffff ffff;
b 的拓展位添0,为 0x0000 00ff;
2:printf("%d\n", a>b);
此时只有整型提升,a和b都被解释为unsignedint ,输出的比较结果为0.
3:当b或者a中任意一个强制转换为unsignedint时候,此时除了整型提升,还要进行算数转换,(因为操作符的两个操作数属于不同类型)。根据寻常算数转换规则signed int类型的要转换为unsigned int ,此时 a则被解释为一个很大的数。通过printf("%u\n", a);可以看出,远大于b的值。
所以语句 printf("%d\n",a>(unsigned int)b);
printf("%d\n",(unsigned int)a>b);
比较表达式 a>b 输出的结果都为1.
运行结果如下:
- c 整型提升和算数转换
- C语言中的算数转换和整形提升
- 【C语言】整型溢出和整型提升
- C语言 sizeof 整型提升 类型转换
- 隐式类型转换和整型提升
- C中的整型提升
- C中的整型提升
- C专家编程-整型提升与寻常算术转换
- C整型升级和寻常算术转换
- C整型升级和寻常算术转换
- C 语言中的整型提升
- C语言进阶:整型提升
- C语言进阶:整型提升
- c语言:算数转换举例
- C语言中的数值类型转换:整型提升/寻常算术变化/截断/强制类型转换
- 整型提升 和 位操作
- [原创]c++整型提升(类型转换)
- 『C/C++』整型和字符串相互转换
- [LeetCode] Unique Paths II
- android自动更新模块实现中知识总结
- Eclipse安装SVN插件
- TextView属性大集中
- 第11周项目2求最大公约数(1.两个数)
- c 整型提升和算数转换
- 安卓环境搭建
- sde for Oracle10g 64bit 删除 SDE用户无法删除的问题
- 结构体的使用
- mysql server advanced 5.6安装
- cocos2d-x 3.2文件读写(普通文件,plist,xml)
- 喜欢玩warcraft的ltl
- java程序调用存储过程和存储函数
- HelloWorld