c - 64位机器中LONG_MAX -1吗?

标签 c types numbers

我发现LONG_MAX (9223372036854775807)实际上在64位机上的long类型变量上保存如下。

Hex: 0xffff ffff ffff ffff ffff ffff ffff ffff

Bin: 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

据我所知,最高有效位用作有符号位。

Windows 计算器中的 9223372036854775807 更改如下。

Hex: 0x7fff ffff ffff ffff ffff ffff ffff ffff
Bin: 01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

所以,恕我直言,LONG_MAX 应保存如下

Hex: 0x7fff ffff ffff ffff ffff ffff ffff ffff
Bin: 01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

长变量是否被视为无符号值?

我注意到有人问我是如何发现这种情况的。

我在下面的代码中发现了这种情况。

#include <stdio.h>
#include <limits.h>

int main(int argc, char *argv[])
{
        long a;

        a = strtol(argv[1], NULL, 0); 

        printf("%ld\n", a); 

        return 0;
}

实际上,我没有使用LONG_MAX宏,但是当我执行程序时,我静态地使用了9223372036854775807值。

我检查了该值作为 0x7fff 是安全的...使用 gdb 如下所示

Reading symbols from test...done.
(gdb) b main
Breakpoint 1 at 0x40055c: file test.c, line 8.
(gdb) r 9223372036854775807
Starting program: ./test 9223372036854775807

Breakpoint 1, main (argc=2, argv=0x7fffffffe308) at test.c:8
8       a = strtol(argv[1], NULL, 0);
(gdb) n
10      printf("%ld\n", a);
(gdb) x/gt &a
0x7fffffffe218: 1111111111111111111111111111111111111111111111111111111111111111
(gdb) 

即使我没有使用 LONG_MAX 宏,值 9223372036854775807 与 LONG_MAX 宏相同。

所以,我认为它应该保存为 0x7fff ...就像使用 LONG_MAX 一样。

最佳答案

您忘记包含 <stdlib.h> ,因此您的编译器发出警告,例如 warning: implicit declaration of function ‘strtol’ .

当您选择忽略警告时,编译器仅考虑 strtol 的返回值。如int (32位值)而不是long (64 位值),因此会发生从 64 位到 32 位的截断,从而产生差异。

演示:

#include <stdio.h>
#include <limits.h>
//#include <stdlib.h>

int main(int argc, char *argv[])
{
        long a, b;
        a = strtol("9223372036854775807", NULL, 0); 
        b = LONG_MAX;
        printf("%ld %ld\n", a, b); 
}

在不取消注释的情况下运行此命令 #include <stdlib.h> .

结论:始终将包含“隐式”一词的警告视为错误。

关于c - 64位机器中LONG_MAX -1吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66596527/

相关文章:

types - Haxe lua.Table<字符串,整数> : String should be Int

c - linux fork socketpair sock_dgram

python - 如何使用 ctypes 将声明变量的引用传递给 python 中的 C 函数

java - 在Java中,如何获取所有可能的返回类型?

c# - 从范围中选择但排除某些数字

javascript - 允许数字并仅在可编辑内容的 div 按键上输入

random - Go中如何生成固定长度的随机数?

c - 你如何通过fd获取文件大小?

c - 无法创建超过 1000 个文件(C++ 程序)

indexing - 如何查询和列出 elasticsearch 索引中的所有类型?