如何解决这个lint警告"从int到unsigned int的隐式二进制转换"

时间:2016-02-01 05:56:38

标签: c++ lint misra pc-lint

这是代码:

{{1}}

我收到了一条lint消息:

{{1}}

为什么呢?以及如何避免这种情况?

4 个答案:

答案 0 :(得分:2)

您正在比较x unsigned short1,默认为int。因此,您获得了隐式二进制转换。

为编译器提供一个提示,确实要将x与另一个unsigned值进行比较:

if ((x==1U) && y)

答案 1 :(得分:0)

试试这个

public void getJsonRequest(String url, final resultInterface listener){
  JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,url, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                listener.Success(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                listener.Error(error);
            }
        });}

答案 2 :(得分:0)

因为1被视为int。使用

unsigned int x 

或演员

答案 3 :(得分:0)

目前尚不清楚您使用的是哪个版本的MISRA。在编写C ++代码时,您应该使用MISRA-C ++,其他一切都将违反MISRA规则。显然,使用MISRA-C检查程序无法检查是否符合MISRA-C ++。

无论如何,假设您的系统具有32位整数,无论​​MISRA版本如何,这都应该解决问题:

if ( ( static_cast<uint32_t>(x) == 1u ) && y)   // compliant

要理解的重要部分是隐式促销如何运作以及如何避免它们:

  • 1字面值转换为unsigned short将无法解决任何问题。这样的强制转换是完全多余的,因为操作数无论如何都会立即将整数提升回int

    if ( ( x == static_cast<unsigned short>(1) ) && y) // not compliant

    unsigned short ushort=1u; if ( ( x == ushort ) && y) // not compliant

  • 1字面值转换为unsigned int或仅将其转换为1u(同样的事情)将使程序按预期运行,但不会解决MISRA警告。因为您仍然有x操作数的隐式类型提升,这是MISRA违规。

    if ( ( x == 1u ) && y) // not compliant

    if ( ( static_cast<unsigned int>(1) == x ) && y) // not compliant

研究整数提升通常的算术转换