C 转换为;USHORT“;从';int';可能会改变它的价值

C 转换为;USHORT“;从';int';可能会改变它的价值,c,type-conversion,unsigned,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 [-Werro

我在为嵌入式平台改编一段代码时遇到了一些麻烦

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;
但尽管如此,我们注意到了变化


谢谢

也许1被视为int,并且(*uslen+1)操作的结果也是int,那么ushort中的矫揉造作可能会导致信息丢失。 有关信息: ushort按0到65535的2个字节进行编码 int在2或4上编码(取决于编译器和处理器),从-32768到32767,或从-2147483648到2147483647 也许你应该试试这样的东西 *usLen=*usLen+(USHORT)1; 或 *usLen=(USHORT)(*usLen+(USHORT)1); 并在进行加法之前测试最大值
希望能有所帮助

也许1被视为int,并且(*uslen+1)操作的结果也是int,那么ushort中的矫揉造作可能会导致信息丢失。 有关信息: ushort按0到65535的2个字节进行编码 int在2或4上编码(取决于编译器和处理器),从-32768到32767,或从-2147483648到2147483647 也许你应该试试这样的东西 *usLen=*usLen+(USHORT)1; 或 *usLen=(USHORT)(*usLen+(USHORT)1); 并在进行加法之前测试最大值
希望这能有所帮助

我认为编译器选项(
[-Werror=conversion]
)是罪魁祸首。表达式
*usLen+=1
是该选项的语法糖:

*usLen = *usLen + 1;
因此,您添加了一个无符号的short和一个int。无符号的short值被提升为int(assumint int可以表示所有无符号的short值,这对于所有常见的32位和64位体系结构都是正确的),最后您将int分配给一个无符号的short,该无符号的short可以截断值,但完全由C标准定义。这通常是对常见选项的警告,但这里的错误表示编译器被特别指示引发错误

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

*usLen += (unsigned short) 1;


我想说编译器选项(
[-Werror=conversion]
)是罪魁祸首。表达式
*usLen+=1
是该选项的语法糖:

*usLen = *usLen + 1;
因此,您添加了一个无符号的short和一个int。无符号的short值被提升为int(assumint int可以表示所有无符号的short值,这对于所有常见的32位和64位体系结构都是正确的),最后您将int分配给一个无符号的short,该无符号的short可以截断值,但完全由C标准定义。这通常是对常见选项的警告,但这里的错误表示编译器被特别指示引发错误

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

*usLen += (unsigned short) 1;


您必须将
1
转换为
USHORT

  • *usLen+=(无符号短)1
  • *usLen+=(USHORT)1

  • 您必须将
    1
    转换为
    USHORT

  • *usLen+=(无符号短)1
  • *usLen+=(USHORT)1

  • 你对
    *usLen++
    也有同样的问题吗?它似乎可以工作,但它给了我另一个错误:错误:不使用计算的值,我同意这一点,因为用++递增它,只会在该语句中递增它的局部值,递增的值永远不会重新分配到该点指向的内存位置,或者重试“*usLen+=(USHORT)1”。原始语句接受int 1,将usLen转换为int,添加它们,然后尝试将它们重新分配给short。如果值为0xffff,则可能存在问题。相同错误:(,顺便说一句,我找到了一个非非常漂亮的解决方案,我对一个非指针辅助变量进行操作,然后将值分配给被取消引用的指针。这是什么编译器,是什么体系结构,顺便说一句?你对
    *usLen++
    有相同的问题吗?它似乎可行,但它给了我另一个错误:错误:没有使用计算值,我同意你的看法因为用++递增它,只会在该语句中递增它的本地值,所以递增的值永远不会重新分配到该指针指向的内存位置,或者尝试“*usLen+=(USHORT)1“。原始语句接受int 1,将usLen转换为int,添加它们,然后尝试将它们重新分配给short。如果值为0xffff,则可能存在问题。相同错误:(,顺便说一句,我找到了一个非非常漂亮的解决方案,我对一个非指针辅助变量进行了操作,然后将值赋给被取消引用的指针。这是什么编译器?顺便说一句,这是什么体系结构?我关心的1是一个整数常量(文字)编译器在这里应用正确的规则,因为当你做a+=b时,并不总是与a=a+b相同。就我而言,1是一个整数常量(文字),所以编译器在这里应用正确的规则,因为当你做a+=b时,并不总是与a=a+b相同。