当我尝试使用 fseek() 返回到文件中一行的开头时,出现错误。
我的代码如下:
fseek(inptr, -bi.biWidth * sizeof(RGBTRIPLE), SEEK_CUR)
bi.biwidth 是 int32_t 类型。
我收到以下错误:
runtime error: unsigned integer overflow: 18446744073709551613 * 3 cannot be represented in type 'unsigned long'
现在我明白了错误,但我不知道如何解决它。请帮忙。
此外,还有什么其他方式可以实现这一点?
最佳答案
无符号数学。
sizeof(RGBTRIPLE)
的值为 3,类型为 size_t
,一些 unsigned 类型。 (size_t
在 OP 的机器上是 unsigned long
)
-bi.biWidth
具有比 size_t
窄的某些有符号类型的值 -3,可能是 int
。
相乘时,-3 将转换为 size_t
类型,值为 18446744073709551613u
或 0xfffffffffffffffd
。
本产品超过size_t
。
fseek()
需要一个 long
,所以使用 long
数学。
fseek(inptr, -bi.biWidth * (long) sizeof(RGBTRIPLE), SEEK_CUR)
RGBTRIPLE
的类型在这里不是问题。 @Dmitri
关于c - 如何到达文件中特定行的开头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43639564/