Moo*_*ius 0 c hex bit-manipulation long-integer
我期望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)
strtol("ffffffffffffffff", NULL, 16)请求strtol将 \xe2\x80\x9cffffffffffffffff\xe2\x80\x9d 解释为十六进制整数。它不要求strtol将其解释为各个字节的十六进制值规范,然后将这些字节重新解释为long.
十六进制整数 ffffffffffffffff 16为 18,446,744,073,709,551,615 = 2 64 \xe2\x88\x921。在 C 实现中,a 可表示的最大值为long9,223,372,036,854,775,808 = 2 63 \xe2\x88\x921。
C 2018 7.22.1.4 8 中的 文档strtol表示,如果值高于或低于可表示值的范围,LONG_MAX或LONG_MIN,则分别返回:
\n\n、
\nstrtol、和函数返回转换后的值(如果有)strtoll。如果无法执行转换,则返回零。如果正确的值超出了可表示值的范围,则返回、 、、、、或(根据值的返回类型和符号,如果有的话),并且宏的值存储在 中。strtoulstrtoullLONG_MINLONG_MAXLLONG_MINLLONG_MAXULONG_MAXULLONG_MAXERANGEerrno
在阅读并理解其文档之前,最好不要调用,尤其是不要依赖任何例程。特别是当例程的行为不符合您的预期时,请阅读其文档。
\n| 归档时间: |
|
| 查看次数: |
1013 次 |
| 最近记录: |