解决现有代码库中此类警告的正确方法是什么?
void test(uint16_t x, uint16_t y)
{
// warning: conversion to 'uint16_t' from 'int' may alter its value
uint16_t value = (x + 1) * y;
...
}
这三个值都是无符号的16位整数,任何算术溢出都将正确执行,而不会警告该平台的int
是16位的,我看不出应该编写这段代码的另一种方式,除了由于整数提升而强制转换结果。
答案 0 :(得分:6)
在所有这些情况下我都应该投吗?投射感觉就像我做错了。
至少在代码可移植的情况下,这是正确的做法。如果仅针对16位平台进行编译,则不应发出警告,否则,请使用显式强制转换为<script>
$(document).ready(
function() {
$('#education').on(
'change',
function() {
if ($(this).val() == "6") {
$('#checkBox').show(); //check box exists
} else {
$('#checkBox').hide(); //check box exists
}
});
});
$('#checkBox').on(
'change',
function() {
if ($('#checkBox').is(":checked")) {
$("#txtData").show();
} else {
$("#txtData").hide();
}
});
</script>
来使警告静音:
uint16_t
您无能为力:所有算术运算都(至少)以uint16_t value = (uint16_t) (x + 1) * y;
的形式执行,编译器会提醒您。根据{{1}}和int
的值,结果很可能不适合x
。明确地编写您知道的转换文档,并希望截断或确保不会发生。
答案 1 :(得分:2)
注意:以下仅适用于16位int情况
警告:关于x
到int
的隐式转换,因为1
的类型为int
。
出于相同原因,后来将y
转换为int
也会触发此操作。
只需将1
标记为未签名
void test(uint16_t x, uint16_t y)
{
uint16_t value = (x + 1u) * y;
...
}
不需要强制转换。
这也将在 16位情况下起作用:
void test(uint16_t x, uint16_t y)
{
uint16_t value = x * y + y;
...
}