我期望strtol("ffffffffffffffff", NULL, 16)return-1和strtol("7fffffffffffffff", NULL, 16)return LONG_MAX,因为linux 手册页第一句话似乎暗示 strtol 返回signed long 。第二次调用确实返回了预期的结果。但是第一个调用返回了LONG_MAX!就像,输入的十六进制字符串甚至不相同。好像这还不够令人困惑,strtol("8000000000000000", NULL, 16)我期望返回的LONG_MIN,返回与前两个调用 相同的值LONG_MAX。对于前两次调用,我认为 strtol 忽略了输入字符串中的最高有效位,但第三次调用驳斥了这一假设。
这是某种奇怪的铸造情况还是我将数学现实与 C 现实混合在一起?
这是我的源代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[]) {
long x = strtol(argv[1], NULL, 16);
printf("%ld\n", x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在 Ubuntu 上进行编译gcc scratch.c,并通过将十六进制字符串作为命令行参数传递来获取结果。例如:
./a.out ffffffffffffffff // gives LONG_MAX
./a.out 8000000000000000 // gives LONG_MAX
./a.out 7fffffffffffffff // gives LONG_MAX
Run Code Online (Sandbox Code Playgroud)