小编Moo*_*ius的帖子

C strtol 如何解释十六进制字符串?

我期望strtol("ffffffffffffffff", NULL, 16)return-1strtol("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)

c hex bit-manipulation long-integer

0
推荐指数
1
解决办法
1013
查看次数

标签 统计

bit-manipulation ×1

c ×1

hex ×1

long-integer ×1