Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在C(和C+;+;)标准中uintptr和intptr是可选类型?_C++_C_C++11_C99 - Fatal编程技术网

C++ 为什么在C(和C+;+;)标准中uintptr和intptr是可选类型?

C++ 为什么在C(和C+;+;)标准中uintptr和intptr是可选类型?,c++,c,c++11,c99,C++,C,C++11,C99,对于C99(及更高版本的标准),标准要求某些类型在标题中可用。对于确切的宽度,例如,int8\u t,int16\u t等,它们是可选的,并且在标准中是受激励的 但是对于uintpr\u t和intptr\u t类型,它们也是可选的,但我不认为它们是可选的而不是必需的。在某些平台上,指针类型的大小比任何整型都大。我相信这样一个平台的例子是IBMAS/400,它的虚拟指令集将所有指针定义为128位。这类平台最近的一个例子是Elbrus。它使用128位指针,这些指针是硬件描述符,而不是普通地址。有这

对于C99(及更高版本的标准),标准要求某些类型在标题
中可用。对于确切的宽度,例如,
int8\u t
int16\u t
等,它们是可选的,并且在标准中是受激励的


但是对于
uintpr\u t
intptr\u t
类型,它们也是可选的,但我不认为它们是可选的而不是必需的。在某些平台上,指针类型的大小比任何整型都大。我相信这样一个平台的例子是IBMAS/400,它的虚拟指令集将所有指针定义为128位。这类平台最近的一个例子是Elbrus。它使用128位指针,这些指针是硬件描述符,而不是普通地址。

有这样的平台吗?@BoR当然,x86实模式怎么样,地址是20位长,但机器字大小是16位?@Oliv:肯定还有更多。2^128等于~10^38。地球质量约为6*10^24千克。如果我们用非常重的原子,摩尔数是1kg,那么地球有6*10^24*6*10^23=3.6*10^48个原子。至少,这是一个非常悲观的估计。这远高于2^128。:)有,也就是:)对于具有有界指针的实现,或者指针是某种类型的对象id、偏移量的元组,以及可能支持内存安全实现的其他信息的实现,也是如此。可能存在无法(有效)支持它们的硬件。因此,标准不能强制要求他们。对于普通平台,你几乎可以假设它们存在——如果它们不在你选择的平台上,你就会知道它们是否存在。@JesperJuhl:在我看来,这是一个值得怀疑的设计决策。即使一个
uintptru\t
是无效的,拥有它也比没有它更好。有些问题只能通过这种类型(以实现定义的方式)来解决。所以一个高质量的实现应该始终提供这种类型。@geza有一个可移植的类型以实现定义的方式使用没有多大意义,想想看…@ArneVogel:这似乎是一个矛盾,但事实并非如此。如果
uintptru\t
始终可用,那么使用它的程序可以更方便地移植,因为您不必担心它是否可用。有一些问题,精确的转换并不重要。例如,xor链表。我认为一个高质量的实现应该做到预期的事情:例如,将1添加到
TYPE*
中应该与将
sizeof(TYPE)
添加到转换的整数中一样(因此可以避免expr.add的未定义行为)。