ISO/IEC 9899:1990关于短int,int,long的编程语言C定义

ISO/IEC 9899:1990关于短int,int,long的编程语言C定义,c,C,Blockquote“ISO/IEC 9899:1990,编程语言-C(ISO C)保留短int、int、long int和指针的定义故意模糊,以避免人为地限制硬件体系结构,这些硬件体系结构可能从定义独立于其他数据类型的这些数据类型中获益。唯一的限制是int不得小于shorts,long不得小于int和size_t必须表示一个实现支持的最大无符号类型。例如,可以将短字符定义为16位,int字符定义为32位,长字符定义为64位,指针定义为128位。基本数据类型之间的关系可以表示为: sizeof(

Blockquote“ISO/IEC 9899:1990,编程语言-C(ISO C)保留短int、int、long int和指针的定义故意模糊,以避免人为地限制硬件体系结构,这些硬件体系结构可能从定义独立于其他数据类型的这些数据类型中获益。唯一的限制是int不得小于shorts,long不得小于int和size_t必须表示一个实现支持的最大无符号类型。例如,可以将短字符定义为16位,int字符定义为32位,长字符定义为64位,指针定义为128位。基本数据类型之间的关系可以表示为: sizeof(字符) 为什么我们需要如此模糊地定义这些数据类型

根据你的摘录,原因是

避免人为地限制可能 独立于其他数据类型定义这些数据类型的好处

不过,我觉得这个措辞有点尴尬。基本思想是,该标准允许不同硬件架构的C实现为自然适合硬件的各种类型选择大小。顺便说一句,这不仅仅是32位与64位的比较。我个人使用了8位、16位、32位和64位计算rs,我曾开发过最初为36位和其他原生字号的计算机编写的软件。这正是我可以声称的任何个人连接。过去、现在和未来计算硬件的多样性远比我猜想的要大,但C可以有效地实现它的种类非常广泛

long和int64的区别是什么?long的大小将由系统决定&int64保证为64位


C语言没有定义任何名为
int64
的类型。特别是您摘录引用的版本C90没有提供类型。较新版本的C定义了一个类型
int64\t
,实现不需要提供该类型。如果有,它是一个整数类型,只有一个符号位,63个值位,在一些系统上,
long
int64\t
是相同的类型,而在其他系统上,它们是不同的类型。在另一些系统上,没有
int64\t
。例如,在微软的C实现中,
long
即使在64位硬件上也是32位类型。

F首先,必须指出的是,C语言是在一个非常早期的计算机时代发明的,它是基于20世纪60年代的B和BCPL语言。当时存在着许多不同的实验计算机——没有人知道哪些计算机能够生存或成为行业标准

正因为如此,C语言甚至支持三种不同形式的有符号数字格式:1的补码、2的补码和有符号的大小。其中1的补码和有符号的大小允许带有奇异的行为,如陷阱表示或填充位。但大约99.999%的现代实际计算机使用2的补码因此,所有这些都是毫无帮助的

为什么我们需要如此模糊地定义这些数据类型

我们没有。不给整数类型一个固定的大小和符号可以说是一个幼稚的设计错误。当时的基本原理是允许C在尽可能多的不同计算机上运行。事实证明,这与在不同计算机之间移植C代码完全不同

懒惰的程序员可能会发现到处乱发垃圾邮件而不考虑整数限制是很方便的,然后得到一个“合适的、足够大的局部有符号整数”“。但当我们需要使用16位2的补码时,这一点都没有帮助。或者当我们需要优化尺寸时。或者,当我们使用8位CPU,并希望尽可能避免任何大于8位的内容时

因此,
int
&friends的可移植性不强:其大小和签名格式未知且跨平台不一致,这使得这些所谓的“原始数据类型”具有潜在的危险性和/或低效性

更糟糕的是,
int
的不可预测行为与其他语言缺陷相冲突,比如隐式int类型提升(请参阅),或者像
1
这样的整数常量总是
int
。这些规则旨在将每个表达式转换为
int
,以避免不称职的程序员在计算小型有符号整数类型时出现溢出

例如
int8\u t i8=0。。。i8=i8+256实际上不会导致C中的有符号溢出,因为该操作是在类型
int
上执行的,然后将其转换回小整数类型
int8\t
(尽管是以实现定义的方式)

然而,隐性晋升规则总是弊大于利。当从16位系统移植到32位系统时,您的
无符号short
可能会突然无声地变成
有符号int
。这反过来会产生各种各样的细微错误,特别是在使用位运算符/编写硬件相关代码时。这些规则在小整数类型和大整数类型在表达式中的工作方式之间造成了不一致

为了解决其中一些问题,
stdint.h
早在1999年就在该语言中引入了。它包含诸如
uint8\t
之类的类型,这些类型保证在任何系统中都具有固定大小。它们保证是2的补码。此外,我们可以使用诸如
uint\u fast8\t
之类的类型,让编译器为给定的系统选择最快的合适类型,便于移植。当今大多数专业的C软件——特别是嵌入式系统——只使用
stdint.h
类型和n