繁体   English   中英

条件运算符:从“int”转换为“unsigned char”,可能丢失数据

[英]Conditional operator: conversion from 'int ' to 'unsigned char ', possible loss of data

我有以下 C 代码:

a = (b == B1) ? A1 : A2;

abA1A2B1都是unsigned char类型。 A1A2B1都是常数。

在 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;

这就是您收到警告的原因。 同样, A1A2是常数这一事实没有任何作用。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM