转换为" USHORT"来自' int'可能会改变它的价值

时间:2016-12-16 08:19:29

标签: c type-conversion unsigned

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

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;

但仍然注意到变化。

谢谢

3 个答案:

答案 0 :(得分:2)

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

*usLen = *usLen + 1;

所以你添加一个unsigned short和一个int。 unsigned short值被提升为int(assumint int可以表示所有常见的32位和64位体系结构的所有无符号短值),最后将int分配给可以截断值,但完全由C标准定义。它通常是对常见选项的警告,但是这里的错误表明编译器被特意指示引发错误。

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

*usLen += (unsigned short) 1;

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

答案 1 :(得分:1)

也许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); 并在进行添加之前测试最大值 希望可以帮助

答案 2 :(得分:0)

您必须将1转换为USHORT

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