c/c++ 不同类型数据运算时的隐式转换规则

在c/c++中不同类型数据运算时会隐式的转化到更大数据类型进行运算,所以有时运行结果很令人费解。

#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
	short s = 'a';
	unsigned int ui = 1000;
	int i = -2000;
	double d = i;
 
	cout << "d = " << d << endl;
	cout << "ui = " << ui << endl;
	cout << "ui + i = " << ui + i << endl;
 
	if ((ui + i) > 0) //当一个unsigned int数和一个int相加时 会将进行运算的两个数隐式的转化为unsigned int后在进行相加 所以输出一个很大的整数
	{
		cout << "Positive" << endl;
	}
	else
	{
		cout << "Negative" << endl;
	}
	//当char与short类型进行运算,会隐式的转化为int类型 所以输出4 
	//之所以会转化为int 因为对于编译器来说int类型的运算更加高效
	cout << "sizeof(s + 'b') = " << sizeof(s + 'b') << endl;
 
	return 0;
}

gcc中运行结果为

d = -2000
ui = 1000
ui + i = 4294966296
Positive
sizeof(s + 'b') = 4

vc++中运行结果为

d = -2000
ui = 1000
ui + i = 4294966296
Positive
sizeof(s + 'b') = 4

 

隐式转换:进行表达式运算时,不同数字的数据类型不同,gcc编译器会自动转换为相同的数据类型之后,再进行运算(其实就是先转换为二者中的高级的再进行运算)。 隐式转换:低级–>高级 隐式转换:
  1. 内存小–>内存大

  2. 整型数据类型–>浮点数据类型

  3. 有符号–>无符号

显式转换:目标类型变量=(目标类型)源类型变量;

#include <stdio.h>
int main(void) {

	//由于里面有0.9小数,gcc编译器把它默认当成double类型(8字节),gcc自动将int类型的1转换成double类型的1
    printf("sizeof(1?1:0.9)的结果是%lu\n", sizeof(1?1:0.9));    //8

    //gcc编译器把-7和3都当成int类型,无需数据类型转换,直接运算-4显然小于0,结果为0假
    printf("-7 + 3 > 0的结果是%d\n", -7 + 3 > 0);         //0

    //由于里面有3u,gcc把它当成无符号类型,所以gcc自动将-7有符号转为无符号的数字(肯定是正数)再和3做加法
    //显然结果大于0,结果为1真  
    printf("-7 + 3u > 0的结果是%d\n", -7 + 3u > 0);    //结果为1
    

    printf("(char)300强转结果是%d\n", (char)300);
    int  a = 555;
    char b = (char)a;     //char  -127,128     unsigned char   0,255
    printf("a = %d, b = %d\n", a, b);

    int c = 520;
    long d = (long)c;  //小转大:int:4字节,long:8字节
    printf("c = %d, d = %ld\n", c, d);
    return  0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值