假设我有以下情况:
int i = 10;
short s = 5;
if (s == i){
do stuff...
} else if (s < i) {
do stuff...
}
当C进行比较时,它会转换较小的数据类型,在这种情况下,short是int还是将右边的数据类型转换为左边的数据类型? 在这种情况下int为short?
答案 0 :(得分:11)
这由通常的算术转换决定。对于简单的情况,一般的经验法则是将具有“较小”精度的类型转换为与具有“更多”精度的类型匹配,但是一旦开始混合signed
和unsigned
,它就会变得有些复杂
在C99中,这由第6.3.1.8节描述,为方便起见,我在此处加入:
首先,如果任一操作数的对应实数类型为
long double
, 另一个操作数被转换, 不改变类型域,到 类型对应的实际类型是long double
。否则,如果任一操作数的对应实数类型为
double
, 另一个操作数被转换, 不改变类型域,到 类型对应的实际类型是double
。否则,如果任一操作数的对应实数类型为
float
, 另一个操作数被转换, 不改变类型域,到 类型对应的实际类型是float
。否则,将对两个操作数执行整数提升。然后 以下规则适用于 推广操作数:
- 如果两个操作数具有相同的类型,则不再进行进一步的转换 需要的。
- 否则,如果两个操作数都有有符号整数类型或两者都有 无符号整数类型,操作数 具有较小整数的类型 转换等级转换为 排名较高的操作数的类型。
- 否则,如果具有无符号整数类型的操作数具有等级 大于或等于的等级 另一个操作数的类型,然后是 带符号整数类型的操作数是 转换为操作数的类型 无符号整数类型。
- 否则,如果带有符号整数类型的操作数的类型可以 代表了所有的价值观 带有无符号的操作数的类型 整数类型,然后是操作数 无符号整数类型转换为 带有签名的操作数的类型 整数类型。
- 否则,两个操作数都将转换为无符号整数类型 对应的类型 带有符号整数类型的操作数。
我已经突出显示适用于您的特定示例的部分。
整数转换等级的概念在6.3.1.1节中定义,它基本上描述了您可能期望的内容(精度较低的类型的排名低于具有更高精度的类型)。< / p>
答案 1 :(得分:5)
第44页的隐式转换集虽然是非正式的,但却是现在要记住的集合。如果你注意到它们很容易记住,正如作者所说,
the `lower' type is promoted to the `higher' type,'' where the
类型的顺序是
char < short int < int < long int < float < double < long double
这个规则很容易记住 - “从低到高” - 但是对于有符号和无符号整数类型它没有多大帮助,这些在Oli的帖子中得到了很好的解释。但在大多数情况下,它很容易记住并帮助你。
答案 2 :(得分:2)
作为一般规则,如果它们不是同一类型,C将不会比较两个值,并且永远不会将变量隐式转换为精度较低的类型。在您的示例代码中,short
被提升为int
,这相当于写作:
int i = 10;
short s = 5;
if ((int)s == i){
do stuff...
} else if ((int)s < i) {
do stuff...
}
这将完全符合您的预期,但签名/无符号比较也是如此。
答案 3 :(得分:1)
数据类型是各种类型的抽象...就计算机而言,没有int
或short
。有记忆,有数据。
当你说int x
时,你对计算机说“给我足够的字节来存储一个int”,当你说short y
时,你说...你猜对了。
short
,正如您所期望的那样占用的字节少于int
,因此可能(通常会)包含相邻字节中的数据。在比较不同类型的数据时,问题是“相邻位会导致结果偏差吗?”
每当您比较两种不同的数据类型时,您确实在比较存储在两个不同位置的位。存储以表示数据的单个位的最大数量需要与用于比较的相同大小
Casting用于帮助解决此问题。