C核心技术手册(二十五)

本文介绍了C++中的算数类型转换规则,包括不同类型的转换等级、整数提升的过程及其应用场景。通过实例说明了如何进行类型转换,并解释了在特定情况下的编译器警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4.1 算数类型转换

类型转换通常存在于任意两个算数类型中,当必要时,编译器隐式地执行它们,如果新类型能够表示它,此种转换将保护它的值,这通常也并不绝对,例如,当你将一个负数转换为无符号类型,或将一个浮点数的小数部分由double转换为int时,新类型不能表示原来的值,在这种情况下,编译器会产生一个告警。

4.1.1 类型的层次

当算术操作数具有不同的类型时,隐式类型转换由类型的层次来决定,类型的层次依据下列规则:

l 任意两个无符号整数类型具有不同的转换等级,如果一个比另一个宽,它将具有较高等级;

l 每一个有符号整数类型具有与相应的无符号整数类型相同的转换等级,charsigned charunsigned char 具有相同的转换等级;

l 标准的整数类型等级排列如下:

_Bool < char < short < int < long < long long

l 任意标准整数类型具有比同样宽度的扩展整数类型较高的等级;

l 每一个枚举类型具有与相应的整数类型相同的等级;

l 浮点类型以下下顺序排列:

Float < double < long double

l 等级最低的浮点型float的等级高于任何整数类型;

l 每一个复数浮点类型具有与其实数类型和虚数类型相同的等级。

4.1.2整数提升

在任何表达式中,你通常可以使用一个其类型等级低于int的值来替代int unsigned int类型操作数,你也可以将位域当做整数类型操作数来使用,在这种情况下,编译器使用整数提升,任何类型级别低于int的半自动被转换为int类型,倘若int类型能够表示所有操作数原来的类型;如果int不足以表达,操作数会被转换为unsigned int

整数提升通常保护操作数的值,一些例子如下:

Char c = ‘?’;

Unsigned short var = 100;

If (c < ‘A’) //The character constant ‘A’ has type int; the value

//of c is implicitly promoted to int for the comparison.

Var = var + 1; //Before the addition, the value of var is promoted to int

// or unsigned int.

在最后这个语句中,在执行加法操作前,编译器将第一个加数的类型提升为intunsigned int,如果intshort具有相同的宽度,就像在16位机器上,这时,带符号的int类型没有足够的宽度来表示unsigned short类型var的所有值,此种场景下,变量的值被提升为unsigned int,在加法执行以后,结果转换为unsigned short

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值