[c/c++]c语言中类型转换问题

1.不同类型参与运算时,类型转变

其原则是将类型转变为表达式中可容纳范围最大的那个

    int --> ungsigned int --> long --> unsigned long --> long long --> unsigned long long

    float-->double-->long double

    (如果long和int字长相同,unsigne int大于long)

暂时不考虑char和short类型转变(类型提升)

(1)如果两个运算对象一个是有符号的一个是无符号的,并且无符号的类型不小于有符号的类型,带符号的对象转换成无符号的类型;反之如果有符号的类型大,依赖于机器,如果带符号的能存储所有值,就转变成该带符号类型。

 

2.类型提升

进行运算的时候,char、short都转换为int类型,有必要时在运算完成后进行剪裁。

源类型提升后的类型
charint
位段int
枚举int
unsigned charint
shortint
unsigned shortint
数组相应的指针

    如果int不能容纳原数据,则转化为unsigned int。

 

3.举个容易出错的实例

int main()
{
	int d = -1;
	unsigned int c= 1;
	if (d < c)
		cout << "hello visual studio" << endl;
	else
		cout << "wrong" << endl;
	return 0;
}


该比较会出现问题,在比较时一个类型为int,另一个类型为unsigned int,在比较时都转换为unsigned int类型,所以d被转换为了一个很大的数,d=0xfffffffe,导致比较出错。

(尽量使用有符号类型或使用相同类型,使用显示类型转换)

 

4.显示类型转换

    强制类型转化形式:

        cast-name<type>(expression);//其中cast-name可以是static_cast,dynamic_cast,const_cast,reinterpret_cast

    (1)static_cast:任何具有明确定义的类型转换,只要不包含底层const

    (2)const_cast:只能改变运算对象的底层const,去掉const性质。(只改变常量的属性)

        const char *cp;

        const_cast<string>(cp);//invalid,只能改变常量的属性

    (3)reinterpret_cast:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值