如何检查十进制数是否在 unsigned int 32 范围内?
How to check if a decimal number is in range of unsigned int 32?
我有一个 C++ 控制台应用程序,其中输入参数 argv[1]
应该是一个表示 uint32_t
.
范围内的十进制数的字符串
当数字不在uint32_t
范围内(0,或大于4294967295),应用程序应return错误代码1。
我费了好大劲才找到可行的方法。
有什么想法吗?
unsigned long
类型应至少有 32 位,因此它应该能够表示任何 uint32_t
值。
这意味着你应该可以使用std::strtoul
转换argv[1]
然后控制unsigned long
与uint_32_t
具有相同的等级或者该值不是大于 2**32 -1
.
如果我没看错你的问题,你的问题不在于如何用C++编写代码,而是如何着手解决问题:
首先,零 (0) 是 uint32_t
的有效值,因此您只需检查数字是否大于最大值,而不检查数字是否为零。
如果您的程序仅使用数字作为输入,则不可能出现负值(因为减号不是数字)。
如果您使用 strtoul
(如其他答案中所建议的),则必须检查 errno
因为该函数 returns 最大值 (4294967295) 如果此数字是在 argv[1]
中指定(这将是有效的)并且如果指定了更大的数字(这将是无效的)。
如果你想不使用strtoul
来编写这个程序,你也可以使用下面的方法来比较两个表示为字符串的数字:
- 计算不包括前导零的位数。
位数越多的数越大。
- 如果位数相同,则找出第一个不同的数字。
数字越大那个数字越大。
如果所有数字都相等,则数字相等。
此方法也适用于大数字 - 例如具有 100 位十进制数字的数字。
您只需要用这种方式比较字符串 argv[1]
和字符串 "4294967295"
。
我有一个 C++ 控制台应用程序,其中输入参数 argv[1]
应该是一个表示 uint32_t
.
当数字不在uint32_t
范围内(0,或大于4294967295),应用程序应return错误代码1。
我费了好大劲才找到可行的方法。
有什么想法吗?
unsigned long
类型应至少有 32 位,因此它应该能够表示任何 uint32_t
值。
这意味着你应该可以使用std::strtoul
转换argv[1]
然后控制unsigned long
与uint_32_t
具有相同的等级或者该值不是大于 2**32 -1
.
如果我没看错你的问题,你的问题不在于如何用C++编写代码,而是如何着手解决问题:
首先,零 (0) 是 uint32_t
的有效值,因此您只需检查数字是否大于最大值,而不检查数字是否为零。
如果您的程序仅使用数字作为输入,则不可能出现负值(因为减号不是数字)。
如果您使用 strtoul
(如其他答案中所建议的),则必须检查 errno
因为该函数 returns 最大值 (4294967295) 如果此数字是在 argv[1]
中指定(这将是有效的)并且如果指定了更大的数字(这将是无效的)。
如果你想不使用strtoul
来编写这个程序,你也可以使用下面的方法来比较两个表示为字符串的数字:
- 计算不包括前导零的位数。
位数越多的数越大。 - 如果位数相同,则找出第一个不同的数字。
数字越大那个数字越大。
如果所有数字都相等,则数字相等。
此方法也适用于大数字 - 例如具有 100 位十进制数字的数字。
您只需要用这种方式比较字符串 argv[1]
和字符串 "4294967295"
。