[英]Conditional operator: conversion from 'int ' to 'unsigned char ', possible loss of data
我有以下 C 代码:
a = (b == B1) ? A1 : A2;
a
, b
, A1
, A2
和B1
都是unsigned char
类型。 A1
、 A2
和B1
都是常数。
在 VC++ 下编译时,我看到以下警告:
warning C4244: '=' : conversion from 'int ' to 'unsigned char ', possible loss of data
我不明白这个警告 - 所有变量都不是int
类型。 大概某种隐式转换正在发生,但为什么呢?
奇怪的是,以下代码(功能相同)编译时没有警告:
if (b == B1) {
a = A1;
} else {
a = A2;
}
据我所知,这两个代码摘录应该是相同的。
在 C 语言算术 arguments 的三元?:
运算符进行通常的算术转换,即在执行任何进一步计算之前将它们提升为int
。 它们是否是常数并不重要。 重要的是他们有类型unsigned char
(如你所说)和unsigned char
在?:
下总是首先被提升。 基本上,C 语言从不以小于int
的类型执行任何计算。 首先将所有较小的内容转换为int
。
这也是您的情况。 基本上,你的
a = (b == B1) ? A1 : A2;
由 C 语言解释为
a = ((int) b == (int) B1) ? (int) A1 : (int) A2;
这就是您收到警告的原因。 同样, A1
和A2
是常数这一事实没有任何作用。
这
a = A1;
不让右手边进行积分提升,这就是为什么这里没有警告的原因。 此外,在这种简单的情况下(直接赋值),即使A1
被显式声明为int
常量,如果大多数编译器可以看到该常量在目标类型unsigned char
的范围内,它们也不会发出警告。 ?:
的情况更复杂,因此编译器可能会恢复到通用行为并发出警告。
尽管功能相同,但两种代码并不完全相同。
你看,当你使用三元运算符时,这是condition? true_value: false_value
condition? true_value: false_value
,编译器尝试在值之间推断最佳可能类型。
因为 A1 和 A2 是常量(就像你在 OP 中的 state 一样)编译器用它们的实际值替换它们的 position,完全忽略数据类型,将两者都呈现为整数。
因此需要转换结果,如下所示:
a = (unsigned char)((b == B1) ? A1 : A2);
a = (unsigned char)((b == B1) ? A1 : A2);
我相信这是因为子语句中没有右值——它们在词法分析器中自动转换为 int。 上面的代码应该解决警告消息并且对生成的代码没有影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.