如何在C语言中检查int变量是否包含合法(非陷阱表示)值? 背景:

如何在C语言中检查int变量是否包含合法(非陷阱表示)值? 背景:,c,integer,language-lawyer,data-representation,C,Integer,Language Lawyer,Data Representation,这是另一个的后续。我问了C和C++两个问题,很快就得到了C++的答案,因为C++ 20的最后一个草案明确地要求有符号整数类型使用两个补码,并且填充位(如果有的话)不能给出陷阱表示。不幸的是,这对C来说不是真的 当然,我知道大多数现代系统只使用整数的2-补码表示,没有填充位,这意味着无法观察到陷阱表示。尽管如此,C标准似乎仍然允许符号类型的3种表示:符号和大小、一个补码和两个补码。至少C18草稿(n2310 6.2.6)类型表示明确允许为除char之外的整数类型填充位 问题: 因此,在可能的填充位

这是另一个的后续。我问了C和C++两个问题,很快就得到了C++的答案,因为C++ 20的最后一个草案明确地要求有符号整数类型使用两个补码,并且填充位(如果有的话)不能给出陷阱表示。不幸的是,这对C来说不是真的

当然,我知道大多数现代系统只使用整数的2-补码表示,没有填充位,这意味着无法观察到陷阱表示。尽管如此,C标准似乎仍然允许符号类型的3种表示:符号和大小、一个补码和两个补码。至少C18草稿(n2310 6.2.6)类型表示明确允许为除char之外的整数类型填充位

问题:
因此,在可能的填充位或非2的补码符号表示的上下文中,int变量可能包含一致性实现的陷阱值。是否有可靠的方法确保int变量包含有效值?

您可以将int设置为1、2、4,以此类推,直到接近其最大值,并检查object通过指向
char
的指针表示。这将识别值位,但可能需要一些额外的逻辑来将其与偶尔设置的奇偶校验位/填充位区分开来。符号位可以类似地检测。知道哪些位是哪些位,然后可以检查候选位和d的对象表示检测其任何填充位是否打开。不幸的是,这不会告诉您这些填充位是否表示陷阱表示。我认为您无法检查此项。陷阱位甚至不必出现在int对象的对象表示中,因此您无法通过
char
左值访问它。您可以将
int
设置为1、2、4等等,直到接近其最大值,并通过指向
char
的指针检查对象表示。这将识别值位,但可能需要一些额外的逻辑来将其与偶尔设置的奇偶校验位/填充位区分开来。符号位可以类似地检测。知道哪些位是哪些位,您可以然后可以检查候选对象的对象表示,并检测其任何填充位是否打开。不幸的是,这不会告诉您这些填充位是否表示陷阱表示。我不认为您可以检查这一点。陷阱位甚至不必出现在int对象的对象表示中,因此您无法通过gh
char
lvalue。