【问题标题】:Conversion to "USHORT" from 'int' may alter its value从 'int' 转换为 "USHORT" 可能会改变它的值
【发布时间】:2016-12-16 08:19:28
【问题描述】:

我在为嵌入式平台调整一段代码时遇到了一些麻烦。

eMBFuncReadCoils( UCHAR * pucFrame, USHORT * usLen )

上面一行是我遇到问题的函数的原型。

问题是关于*usLen 指针,指令如下:

*usLen += 1;

USHORT 定义如下:

typedef unsigned short USHORT; 

编译器说:

error: conversion to 'USHORT' from 'int' may alter its value [-Werror=conversion]
         *usLen += 1;

我无法弄清楚可能是什么问题。

为什么会因为 int 而引发错误?

我也想过像这样重写作业:

*usLen = *usLen + 1;

但仍然注意到变化。

谢谢

【问题讨论】:

  • *usLen++有同样的问题吗?
  • 它似乎可以工作,但它给了我另一个错误:错误:未使用计算的值,我同意这一点,因为用 ++ 递增它,只是在该语句中递增它的本地值,递增的值永远不会重新分配给该指针指向的内存位置
  • 或尝试“*usLen += (USHORT)1”。您的原始语句采用 int 1,将 usLen 转换为 int,添加它们,然后尝试将它们分配回 short。如果值为 0xffff,则可能有问题。
  • 同样的错误 :(,顺便说一句,我找到了一个不太漂亮的解决方案,我对非指针辅助变量进行操作,然后将值分配给取消引用的指针。
  • 这是什么编译器,什么架构,顺便说一句?

标签: c type-conversion unsigned


【解决方案1】:

我想说编译器选项 ([-Werror=conversion]) 应该归咎于此。表达式*usLen += 1; 是该表达式的语法糖:

*usLen = *usLen + 1;

所以你添加了一个无符号的short和一个int。 unsigned short 值被提升为 int(假设 int 可以表示所有 unsigned short 值,这对于所有常见的 32 位和 64 位架构都是正确的),并且您最终将 int 分配给 可以 截断值,但完全由 C 标准定义。这通常是对常用选项的警告,但这里的错误表示编译器被特别指示引发错误。

您可以放宽编译器选项,或者如果您有充分的理由使用它们,只需使用应允许的显式转换:

*usLen += (unsigned short) 1;

*usLen = (unsigned short) (*usLen + 1);

【讨论】:

  • 就我而言,1 是一个整数常量(字面量),因此编译器在此处应用正确的规则,因为当您执行 a+=b 并不总是与 a = a + b 相同。 See this.
【解决方案2】:

也许1被认为是一个int,而(*uslen + 1)运算的结果也是一个int,那么ushort中的矫揉造作可能会导致信息丢失。 信息: ushort 编码为 0 到 65535 的 2 个字节 int 编码为 2 或 4(取决于编译器和处理器)从 -32 768 到 32 767 或形式 -2 147 483 648 到 2 147 483 647 也许你应该尝试类似的东西 *usLen = *usLen + (USHORT) 1; 或者 *usLen = (USHORT)(*usLen + (USHORT) 1); 并在进行加法之前测试最大值 希望能有所帮助

【讨论】:

    【解决方案3】:

    您必须将1 转换为USHORT

    1. *usLen += (unsigned short) 1;
    2. *usLen += (USHORT) 1;

    【讨论】:

      猜你喜欢
      • 2016-02-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多