似乎这里没有什么复杂的:
int a = 5; /// Тут при сложении int + float логично получить float, но мы получаем double (почему?)
float b = 3.14; /// когда идет присвоение смотрится тип и к нему притирается ответ (тут все ясно)
float c = a + b; /// Не ясно когда выполняются операции между типами иногда не понимаешь какой тип в результате операции мы имеем
问题是在不同情况下转换后会获得哪些数据类型:
char+int
char+float
char+double
int+float
int+double
char+unsigned char
int+unsigned int
float+unsigned float
итд
PS我没有在互联网上找到明确的答案
我不明白你在说什么样的“这里”,但添加
int
后,float
结果完全一样float
。在你下面的例子中,你写这是真的(并且与你上面写的相矛盾)。
在语言中 自恐龙时代以来(尽管可能在 K&R 中),类型操作数确实已自动
float
转换为 typedouble
,但那些日子早已一去不复返了。float
在标准化 C 中从来没有出现过这种情况,尽管在调用类型参数仍被转换为类型的非原型或可变参数函数时,这种行为的回声仍然存在double
。尽管该算法是多级的,但该行为在语言标准中进行了描述。在我的[简化]翻译中
long double
,则将第二个操作数转换为类型long double
double
,则第二个操作数被强制转换为 typedouble
float
,则第二个操作数被强制转换为 typefloat
否则,两个操作数都将进行整数提升1并进一步考虑提升后的类型。
1)整数提升- “小”整数类型
_Bool
,[signed/unsigned] char
,[signed/unsigned] short
到类型int
(如果范围int
足够)或到unsigned int
(否则)的转换。2)排名实际上是该类型在整数类型的“自然”序列中的位置:
_Bool
,char
,short
,int
,long
,long long
。(前缀signed
/unsigned
不影响排名。)3)表示类型
int
对应类型unsigned int
,类型long
对应类型unsigned long
等。很容易看出,从形式上看,确定结果类型的机制是平台相关的,因为它依赖于不同整数类型的可表示值范围的比例。
例如,对于关于 的类型的问题,不可能给出一个普遍明确的答案
char+int
。在我们习惯使用 8 位char
和 32 位的平台上,int
它将是int
. 但是,在具有无符号 16 位char
和 16 位的更奇特的平台上int
,它将是unsigned int
.关于评论中提出的话题:
为什么这样做而不是相反?云中暗水。然而,作为一个在我的代码中狂热坚持“使用无符号类型来表示自然无符号值”原则的人,我个人看到在我的代码中绝大多数整数值都是无符号的。尽管在计算几何领域工作时,我经常遇到非组合问题和自然非正值(坐标等),但程序通常以组合学为主,而且大多数其中的值自然是非负的。并且在有符号值占主导地位的区域,混合有符号和无符号操作数的问题通常根本不会出现。因此,我选择在混合 "
int
与unsigned
这个操作看起来很自然。您还可以引用“C99 基本原理”中关于为什么整数提升以另一种方式进行并且更喜欢将小型类型扩展为带符号
int
的相关主题。请注意,这里也提到了“int
vs. ”问题,UNIX 编译器总是首选无符号转换。unsigned
(我的翻译。)答案可以在 C 标准或专门讨论 C 标准的论坛中找到,尤其是位于 google.com 或 isocpp.org 的论坛。
为了计算运算操作数的一般类型,将所谓的普通算术转换应用于算术类型。
比如在二元运算符+的描述中,C标准中是这样写的(6.5.6加法运算符)
AND(标准 C,6.3.1.8 常用算术转换)
特别是,如上所述
也就是说,在这段代码中
a
表达式的操作数a + b
被转换为类型float
,表达式的结果也是类型float
。如果表达式中没有浮点操作数,则
例如,
关于这个例子
我想补充一点,根据编译器选项集,类型
char
可以表现为类型signed char
或类型。unsigned char
这是一个关于将整数提升应用于整数类型的影响的示例
上面声明的变量的值
a - b
将是一个负数,因为表达式中的两个变量都将被转换为 typeint
。而x - y
下面声明的变量的值将是一个正数。