gpt4 book ai didi

c++ - 条件运算符 : conversion from 'int ' to 'unsigned char ' , 可能丢失数据

转载 作者:太空狗 更新时间:2023-10-29 23:47:20 25 4
gpt4 key购买 nike

我有以下 C 代码:

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

a, b, A1, A2 and B1 都是输入 unsigned charA1A2B1都是常量。

在 VC++ 下编译时,我看到以下警告:

warning C4244: '=' : conversion from 'int ' to 'unsigned char ', possible loss of data

我不明白这个警告 - 所有变量都不是 int 类型。大概正在发生某种隐式转换,但为什么呢?

奇怪的是,以下代码(功能相同)编译时没有警告:

if (b == B1) {
a = A1;
} else {
a = A2;
}

据我所知,这两个代码摘录应该是相同的。

最佳答案

在 C 语言中,三元运算符 ?: 的算术参数会进行通常的算术转换,即在执行任何进一步的计算之前,它们会被提升为 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 的范围内。 ?: 的情况更为复杂,因此编译器可能会恢复到通用行为并发出警告。

关于c++ - 条件运算符 : conversion from 'int ' to 'unsigned char ' , 可能丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6114805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com