警告:从“long long unsigned int”到“long int”的转换中发生溢出,将值从 ........ 更改为 .?

Gun*_*tri 3 c

上述警告是从这一行发出的:

fseek(fp, -sizeof(usr), SEEK_CUR);
Run Code Online (Sandbox Code Playgroud)

fp是我的文件指针,usr也是我的结构。我正在执行上述操作以从文件更新结构。我尝试了各种方法,但无法删除警告:
更精确的警告:

warning: overflow in conversion from 'long long unsigned int' to 'long int' changes value from '18446744073709551304' to '-312' [-Woverflow] 
    fseek(fp, -sizeof(usr), SEEK_CUR);

Run Code Online (Sandbox Code Playgroud)

chq*_*lie 5

您收到此警告是因为sizeof(usr)has type size_t,它是您的目标系统(大概是 Windows)上的 64 位无符号类型,否定此无符号值312会产生一个巨大的值,18446744073709551304该值无法在没有损失的情况下转换为类型long,此超出范围的转换正在实现无论如何定义。您可以通过编写以下内容来解决此问题:

        fseek(fp, -(long)sizeof(usr), SEEK_CUR);
Run Code Online (Sandbox Code Playgroud)

测试 的返回值fseek()将有助于发现潜在的问题。还要确保流以二进制模式打开。

  • 关于以二进制模式 UV 打开的好点。还建议代码检查“fseek()”的返回值。 (2认同)