int64_t Literal Constant?

·

1 min read

事情源於一個 error:

#include <algorithm>
#include <iostream>

int main() {
    int64_t a = 2;
    std::cout << std::min(1L, a) << std::endl;  // mac 上編不過
    std::cout << std::min(1LL, a) << std::endl; // ubuntu 20.04 上編不過
    return 0;
}

無論是 1L 還是 1LL 都沒辦法作為跨平台的通用 int64_t literal。那該怎麼辦?

INT64_C

#include <cstdint>

std::cout << std::min(INT64_C(1), a) << std::endl;

expands to an integer constant expression having the value specified by its argument and whose type is the promoted type of std::int_least8_t, std::int_least16_t, std::int_least32_t and std::int_least64_t respectively

根據 Document ,他的語意是「至少 64 bits 的 integer」,這是沒有保證他「就是 64bits」,所以在這裡是不能用的。

static_cast

std::cout << std::min(static_cast<int64_t>(1), a) << std::endl;

看起來有一點囉唆,但是既可以符合語意,也可以 work。

constant

const int64_t XXX_MIN = 1;

std::cout << std::min(XXX_MIN, a) << std::endl;

假如常數很有意義的話,也不是不行?

Ref

https://stackoverflow.com/questions/78183946/should-i-use-int64-c-as-int64-t-literal