这些都是对应早年 ISA 设计提供的数据类型,一开始就不固定。
只不过 C 之流用了名义类型系统,所以你会进一步感知到 long 和 int 即便可能二进制兼容而仍然不同的笑话。
当然还少不了更经典的 char/signed char/unsigned char ,这些在实际实现中几乎总是保证二进制兼容。
不过钦定数据位宽是更严重的病。谁告诉你 API 就一定在乎位宽了?本来就不需要依赖二进制兼容的地方乱泄漏实现抽象就该治。现实中基本只有持久化协议的外部表示才应该用到这些确定位宽的数据类型,否则就是实现细节污染接口。
还有个更直接的问题是 [u]intN_t 不总是保证可用。比如有 ISA 可是原生只支持 64 位数据的,你非得提供那么多乱七八糟确定位宽的数据类型,还得模拟起来拖后腿;要么就是损害可移植性。(不过反正 Go/Rust 之流本来也没 C/C++ 这样可移植,弃疗也无所谓。)