从 'int' 转换为 "USHORT" 可能会改变其值
Conversion to "USHORT" from 'int' may alter its value
我在为嵌入式平台改编一段代码时遇到了一些麻烦。
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 编码为 2 个字节,从 0 到 65535
int 编码为 2 或 4(取决于编译器和处理器)从 -32 768 到 32 767 或形式 -2 147 483 648 到 2 147 483 647
也许你应该尝试类似的东西
*usLen = *usLen + (USHORT) 1;
要么
*usLen = (USHORT)(*usLen + (USHORT) 1);
并在添加之前测试最大值
希望能帮到你
我会说编译器选项 ([-Werror=conversion]
) 是罪魁祸首。表达式 *usLen += 1;
是那个表达式的语法糖:
*usLen = *usLen + 1;
所以你添加了一个unsigned short和一个int。 unsigned short 值被提升为 int(假设 int 可以表示所有 unsigned short 值,这对于所有常见的 32 位和 64 位体系结构都是正确的),并且您最终将 int 分配给 unsigned short can 截断值但由 C 标准完美定义。它通常是对常见选项的警告,但这里的错误表明编译器被特别指示引发错误。
您可以放宽编译器选项,或者如果您有充分的理由,只需使用应该允许的显式转换:
*usLen += (unsigned short) 1;
或
*usLen = (unsigned short) (*usLen + 1);
您必须将 1
转换为 USHORT
:
*usLen += (unsigned short) 1;
*usLen += (USHORT) 1;
我在为嵌入式平台改编一段代码时遇到了一些麻烦。
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 编码为 2 个字节,从 0 到 65535 int 编码为 2 或 4(取决于编译器和处理器)从 -32 768 到 32 767 或形式 -2 147 483 648 到 2 147 483 647 也许你应该尝试类似的东西 *usLen = *usLen + (USHORT) 1; 要么 *usLen = (USHORT)(*usLen + (USHORT) 1); 并在添加之前测试最大值 希望能帮到你
我会说编译器选项 ([-Werror=conversion]
) 是罪魁祸首。表达式 *usLen += 1;
是那个表达式的语法糖:
*usLen = *usLen + 1;
所以你添加了一个unsigned short和一个int。 unsigned short 值被提升为 int(假设 int 可以表示所有 unsigned short 值,这对于所有常见的 32 位和 64 位体系结构都是正确的),并且您最终将 int 分配给 unsigned short can 截断值但由 C 标准完美定义。它通常是对常见选项的警告,但这里的错误表明编译器被特别指示引发错误。
您可以放宽编译器选项,或者如果您有充分的理由,只需使用应该允许的显式转换:
*usLen += (unsigned short) 1;
或
*usLen = (unsigned short) (*usLen + 1);
您必须将 1
转换为 USHORT
:
*usLen += (unsigned short) 1;
*usLen += (USHORT) 1;