![]() |
1
blinue 2024-06-27 13:13:11 +08:00 ![]() 需要 64 位用 int64_t 就好,现代 C++ 基本淘汰了 long 和 long long
|
![]() |
3
tool2dx OP @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; |
4
dnfQzjPBXtWmML 2024-06-27 13:30:22 +08:00
用[u]intXX_t 就可以完美保证一致性,不清楚你对 INT64_C 和 int64_t 的偏见是哪来的
|
![]() |
5
blinue 2024-06-27 13:33:52 +08:00
@tool2dx #3 标准只要求 long 至少 32 位,long long 至少 64 位,具体多长是编译器决定的。要保证一致性最好用 int64_t
|
![]() |
6
passive 2024-06-27 13:36:00 +08:00 via Android
常年开着 -Wlong-long 写代码,
long 的用途只限于 long double 。 |
![]() |
7
a33291 2024-06-27 13:37:42 +08:00
msvc14(vs2022)上定义是这样
typedef long long int64_t; |
8
lunafreya 2024-06-27 13:42:13 +08:00
不是一回事, `__LP64__`
|
![]() |
9
ivvei 2024-06-27 13:45:55 +08:00
要精确稳定表示 64 位那就用 int64_t , 不会有任何歧义和不一致。
|
10
StarsunYzL 2024-06-27 13:53:32 +08:00 ![]() 标准本身就有保持一致性的 (u)int64_t 来表示 64 位整型,不清楚为啥你非要用 long long 来表示 64 位整型还要保持一致性,这就很尴尬
|
![]() |
11
inhzus 2024-06-27 14:31:33 +08:00
为了避免代码歧义,我一般会用 **u?int64_t** 来表示 64 位整型,这样不管 32 位还是 64 位编译,都能保持一致性
不关心 size ,用 int ,关心 size 用 u?int(16|32|64)_t |
![]() |
12
xylxAdai 2024-06-27 14:55:03 +08:00
都看编译器实现的。不然 long long 一样可以给你用 32 位存
|
13
ho121 2024-06-27 15:16:31 +08:00 via Android
@tool2dx 不能只看某一个编译器对 int64_t 的定义。
long long 的问题是,标准没有明确一定是 64 位。而 int64_t 虽然是个宏,却能保证不同编译器的不同实现下,一定被定义成 64 位的。 |
![]() |
14
zzzlight 2024-06-27 16:29:02 +08:00
CPP 就是这样 看编译器看系统环境 不止 long... 这些各种宏搞得人都容易搞混了 这坑前几年踩好多次了,以为是 64 位发现是 32 位
|
![]() |
15
slack 2024-06-27 16:48:53 +08:00 via Android
移植这种代码也是最困难的,这些玩意也是历史遗留下来的玩意没法改。
|