我认为Rust中的类型名称比C中的要好得多,我会在任何时候选择f64而不是double,u32而不是unsigned int或uint_32t。有什么理由(除了传统)使用那些违反直觉,难以学习的名字吗?
我知道像short和long这样的名字是特定于体系结构的,但这难道不使实际的问题更糟吗?C被称为“可移植程序集”,但在汇编语言中,您实际上必须使用由体系结构定义的正确寄存器和大小,就像在C中一样。因此,我不确定这究竟如何帮助我们生成更好的代码(在可读性方面)。
我能想到的唯一问题是字节大小。如果字节不是八位,那么在类型名中使用位数就不是那么聪明了。但是,为什么我们不使用一些清晰的名称来告诉我们数据类型包含的字节的确切倍数,比如sb (单字节)、db (双字节)、qb (四字节)?
那么,为什么我们在C中使用特定于体系结构的类型名称,即使它不是必要的呢?
发布于 2016-06-11 23:13:55
实际上,所有intN_t类型都不一定存在。只有提供完全N位(不允许填充位)的两个补码有符号整数的实现才能定义相应的intN_t类型(参见C11标准7.20.1.1节)。
char, int, long等类型都保证存在,并且保证允许某些范围的值(见C11标准5.2.4.2.1节),但它们可能不是两个的补充,它们可能允许的值超过了所需的范围,它们在底层实现中可能都是相同的类型,甚至可能是在软件而不是硬件中实现的。换句话说,“正常”积分C类型除了可以分配给它们的一系列值之外,什么也不保证。这就是它们最大可移植性的原因。
当然,在实践中,我们仍然使用char, int, long的主要原因,等等,是因为这是C在很长一段时间内所拥有的,这是每个人都习惯使用的,而char, int8_t, uint8_t, int_least8_t, int_fast8_t等之间的技术差异对很多代码来说并不重要。
但是,如果您确实关心获得最优类型,或者是在其中一个项目中,这些区别确实很重要,那么值得指出的是,所有符合标准的实现都保证存在int_leastN_t和int_fastN_t类型(参见C11标准7.20.1.2和7.20.1.3节),这意味着它们比intN_t类型具有巨大的可移植性优势。
至于Rust,我从他们的文档中收集到的是:锈蚀的整数类型必须存在于所有符合Rust的实现中,有符号的实现必须使用两个补码,它们必须具有定义的溢出行为,而且我找不到“无填充位”要求的任何证据。换句话说,锈蚀整数类型甚至不能完全匹配任何C11整数类型。
https://softwareengineering.stackexchange.com/questions/321982
复制相似问题