为什么C提供的整数类型基本上不适合任何项目?

Ban*_*ami 7 c types integer

我更像是一个系统管理员而不是一个程序员.但是,我花了大量时间在程序员的代码中徘徊,试图弄清楚出了什么问题.和一个令人不安的量时间是花在处理问题时,程序员预期__u_ll_int32_t或什么(是的,我知道这不是真正的)的一个定义,但无论是预期的定义该类型文件的某处其他比它,或(这是更糟糕的,但幸运的是,很少见)预期该定义的语义不是它的东西.

据我了解C,它故意不作整数类型的宽度定义(并认为这是一件好事),而是为程序员提供了char,short,int,long,和long long,在他们所有的符号和无符号的荣耀,与定义最小值该实施(希望)满足.此外,它提供了实现必须提供要告诉你像一个字符,最大的无符号长等优点的宽度然而第一件事任何不平凡的C++项目似乎做的事情程序员不同的宏被导入或发明另一组类型,它们明确地给出了8,16,32和64位整数.这意味着,作为系统管理员,我必须在编程需要一个地方的定义文件(也就是,毕竟是我的工作),但当时并不是所有的所有这些定义的语义是相同的(这轮已多次重新发明)并且我不知道在这里满足所有用户需求的非临时方式.(我有时会使用<bits/types_for_ralph.h>,我知道每次我都会让小狗哭泣.)

试图明确地定义数字的位宽(用一种特别不想这样做的语言)会让程序员感到头疼吗?为什么不知道定义的最小值和平台提供的MAX/MIN宏足以完成C程序员想要做的事情?你为什么要选择一种语言,它的主要优点是它可以在任意比特的平台上移植,然后自己输入特定的比特宽度?

dan*_*n04 11

当C或C++程序员(以下称为第二人称)选择整数变量的大小时,通常是在下列情况之一:

  • 您知道(至少粗略地)变量的有效范围,基于它所代表的真实世界值.例如,
    • numPassengersOnPlane在航空公司预订系统中应该容纳最大的支持飞机,因此需要至少10位.(最多16个)
    • numPeopleInState在美国人口普查制表计划需要适应人口最多的州(目前约为3800万),因此需要至少26位.(最多32个)

在这种情况下,您需要int_leastN_tfrom 的语义<stdint.h>.程序员在intN_t这里使用精确宽度是很常见的,技术上他们不应该这样做; 然而,8/16/32/64位机器今天占据绝对优势,这种区别仅仅是学术性的.

可以使用标准类型并依赖诸如" int必须至少为16位"之类的约束,但缺点是整数类型没有标准的最大大小.如果int你真的只需要16位,那么恰好是32位,那么你就不必要地增加了数据的大小.在许多情况下(见下文),这不是问题,但如果你有一个包含数百万个数字的数组,那么你会遇到很多页面错误.

  • 您的数字不需要那么大,但出于效率原因,您需要快速的"原生"数据类型而不是可能需要在bitmasking或零/符号扩展上浪费时间的小数据类型.

这是int_fastN_t类型<stdint.h>.但是,通常只使用int这里的内置函数,它在16/32位的日子里具有语义int_fast16_t.它不是64位系统上的本机类型,但它通常足够好.

  • 变量是内存量,数组索引或转换指针,因此需要的大小取决于可寻址内存的数量.

这对应于类型定义size_t,ptrdiff_t,intptr_t等你因为这里使用typedef 没有内置有保证为内存大小的类型.

  • 该变量是使用fread/ 序列化到文件的结构的一部分fwrite,或者是从具有自己的固定宽度数据类型的非C语言(Java,COBOL等)调用的结构的一部分.

在这些情况下,您确实需要精确宽度类型.

  • 你只是没有想到合适的类型,并且int习惯了.

通常,这种方法效果很好.


因此,总而言之,所有typedef <stdint.h>都有自己的用例.但是,由于以下原因,内置类型的有用性受到限制:

  • 缺少这些类型的最大尺寸.
  • 缺乏本机memsize类型.
  • 在64位系统上LP64(在类Unix系统上)和LLP64(在Windows上)数据模型之间的任意选择.

至于为什么有这么的固定宽度(冗余的typedef WORD,DWORD,__int64,gint64,FINT64,等)和memsize个(INT_PTR,LPARAM,VPTRDIFF等)整数类型,这主要是因为<stdint.h>使用C的发展起步较晚,人们还在使用旧的编译不支持它,因此库需要定义自己的.C++有这么多字符串类的原因相同.