2014-02-23 68 views
1

正如我们所知,如果发生溢出,strtoXX函数将返回最大(或最小)值,例如,strtoul("999999999999999999999999999999999", NULL, 0)返回ULONG_MAX。但strtoul("0xffffffff", NULL, 0)也返回ULONG_MAX(如果sizeof(无符号长整数)= 4)。strtoXX:检查溢出

那么,我该如何检查溢出?

回答

4

http://www.cplusplus.com/reference/cstdlib/strtoul/

如果读出的值超出表示的值的由 unsigned long int类型的范围内的,该函数返回ULONG_MAX(在 定义),和errno设置为ERANGE。

你正在处理无符号整数,因此无论你的整数有什么符号:它们都被视为无符号整数。和0xFF FF FF FF(假设4个字节,如你所做的那样)是负值,但它被视为+ 4294967295(不是2的补码)。在那种情况下,这也正是ULONG_MAX的价值。

+0

那么检查errno就够了吗? –

+2

@huseyintugrulbuyukisik:在调用'strtoul()'之前,你应该将'errno'设置为'0',以确保它在程序的早些时候没有被设置为'ERANGE'(标准库​​函数不会将'errno'设置为成功时为'0')。 –

+0

在这种特殊情况下(0xFF FF FF FF)errno甚至没有设置,因为它没有溢出(它只是将最大值转换为ULONG_MAX)。不发生钳位 –