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

3
上面的警告是从这一行代码中发出的:
fseek(fp, -sizeof(usr), SEEK_CUR);

这里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);

1个回答

5
您会收到此警告,是因为sizeof(usr)的类型为size_t,在您的目标系统(可能是Windows)上,这是一个64位无符号类型,取反这个无符号值312会产生一个巨大的值18446744073709551304,这个值不能转换为long类型而不丢失,而且这种超出范围的转换在实现中是未定义的。您可以通过编写以下代码来解决这个问题:
        fseek(fp, -(long)sizeof(usr), SEEK_CUR);

测试fseek()的返回值可以帮助捕捉潜在的问题。此外,请确保以二进制模式打开流。


2
关于以二进制模式打开文件的好处,这是一个很好的观点。同时建议代码检查fseek()的返回值。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接