我在为嵌入式平台调整一段代码时遇到了一些麻烦。
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;
但仍然注意到变化。
谢谢
答案 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
:
*usLen += (unsigned short) 1;
*usLen += (USHORT) 1;