C++的 long 是一个很尴尬的存在。

149 天前
 tool2dx
long 在 32 位编译器里,是 32 位整型。在 64 位编译器里,是 64 位整型。

为了避免代码歧义,我一般会用 long long 来表示 64 位整型,这样不管 32 位还是 64 位编译,都能保持一致性。

但是,官方有一个 INT64_C 的宏,是下面这样定义的。也就是官方推荐 64 位编译器,优先选用 long 为 64 位整型。


#if defined(__LP64__)
#define INT64_C(c) c ## L
#else
#define INT64_C(c) c ## LL
#endif


这就很尴尬了,我代码里全部都是 long long ,和 long 并不兼容,属于两个不同类型。

最后决定,我不用官方的 INT64_C 宏了,属于把人带偏的节奏。
1987 次点击
所在节点    编程
15 条回复
blinue
149 天前
需要 64 位用 int64_t 就好,现代 C++ 基本淘汰了 long 和 long long
leeside
149 天前
@blinue 赞同
tool2dx
149 天前
@blinue 这是一回事好吧。

你去看看最新的 stdint.h 头文件里,int64_t 就是用 long 和 long long 来定义的。

#if defined(__LP64__)
typedef long __int64_t;
#else
typedef long long __int64_t;
#endif

typedef __int64_t int64_t;
dnfQzjPBXtWmML
149 天前
用[u]intXX_t 就可以完美保证一致性,不清楚你对 INT64_C 和 int64_t 的偏见是哪来的
blinue
149 天前
@tool2dx #3 标准只要求 long 至少 32 位,long long 至少 64 位,具体多长是编译器决定的。要保证一致性最好用 int64_t
passive
149 天前
常年开着 -Wlong-long 写代码,
long 的用途只限于 long double 。
a33291
149 天前
msvc14(vs2022)上定义是这样

typedef long long int64_t;
lunafreya
149 天前
不是一回事, `__LP64__`
ivvei
149 天前
要精确稳定表示 64 位那就用 int64_t , 不会有任何歧义和不一致。
StarsunYzL
149 天前
标准本身就有保持一致性的 (u)int64_t 来表示 64 位整型,不清楚为啥你非要用 long long 来表示 64 位整型还要保持一致性,这就很尴尬
inhzus
149 天前
为了避免代码歧义,我一般会用 **u?int64_t** 来表示 64 位整型,这样不管 32 位还是 64 位编译,都能保持一致性

不关心 size ,用 int ,关心 size 用 u?int(16|32|64)_t
xylxAdai
149 天前
都看编译器实现的。不然 long long 一样可以给你用 32 位存
ho121
149 天前
@tool2dx 不能只看某一个编译器对 int64_t 的定义。
long long 的问题是,标准没有明确一定是 64 位。而 int64_t 虽然是个宏,却能保证不同编译器的不同实现下,一定被定义成 64 位的。
zzzlight
149 天前
CPP 就是这样 看编译器看系统环境 不止 long... 这些各种宏搞得人都容易搞混了 这坑前几年踩好多次了,以为是 64 位发现是 32 位
slack
149 天前
移植这种代码也是最困难的,这些玩意也是历史遗留下来的玩意没法改。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1053053

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX