整数的大小取决于编译器、操作系统和处理器吗?

推荐答案

这个问题的答案取决于我们愿意离实际考虑有多远.

最终,从理论上讲,C和C++中的一切都依赖于编译器,而仅仅依赖于编译器.硬件/操作系统根本不重要.编译器可以自由实现any厚度的硬件抽象层,并完全模拟任何东西.没有什么可以阻止C或C++实现任何大小和任何表示形式的int类型,只要它足够大以满足语言标准中指定的最低要求即可.这种抽象层的实际示例很容易获得,例如基于诸如Java的"虚拟机"平台的编程语言.

然而,C和C++的目的是高度efficient种语言.为了达到最高效率,C或C++实现必须考虑来自底层硬件的某些考虑.因此,确保每个基本类型都基于硬件直接(或几乎直接)支持的某种表示非常有意义.从这个意义上说,基本类型的大小确实取决于硬件.

换言之,对于64位硬件/ OS平台,特定的C或C++实现完全可以自由地实现int,作为占用128位内存的71位1’s补符号整数类型,使用其他57位作为存储编译器作者女友的生日所需的填充位.这种实现甚至具有一定的实用价值:它可以用来执行C/C++程序可移植性的运行时测试.但这就是该实现的实际用途的终结.不要期望在"普通"C/C++编译器中看到这样的情况.

C++相关问答推荐

整值的最后一个字节如何影响C转换中的char强制转换?

为什么PLT表中没有push指令?

错误:C中需要参数声明符

GCC:try 使用—WError或—pedantic using pragmas

malloc实现:判断正确的分配对齐

在#include中使用C宏变量

以下声明和定义之间的区别

对于C中给定数组中的每个查询,如何正确编码以输出给定索引范围(1到N)中所有数字的总和?

为什么我会收到释放后堆使用错误?

在C++中访问双指针

当b是无符号字符时,int a=(b<;<;2)>;>;2;和int a=b&;0x3F;之间有什么区别?

初始成员、公共初始序列、匿名联合和严格别名如何在C中交互?

判断系统命令返回值的正确方法

从CentOS 7到Raspberry PI 2B的交叉编译-无法让LIBC和System Include标头一起工作

为什么我的旧式&q;函数在传递浮点数时会打印2?

用C++初始化局部数组变量

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题

C/C++编译器可以在编译过程中通过按引用传递来优化按值传递吗?

为什么程序在打印每个数字之前要等待所有输入?

clion.我无法理解 Clion 中发生的 scanf 错误