C 确定最大整数值的安全方法,无需诉诸'limits.h'`

C 确定最大整数值的安全方法,无需诉诸'limits.h'`,c,int,max,C,Int,Max,不使用限制库,这是确定整数最大值的安全方法吗 int max_int = (unsigned int) -1 >> 1; 我相信你提出的准则: int max_int = (unsigned int) -1 >> 1; 确定有符号整数类型的最大值不是一种安全的方法(根据标准),但它肯定适用于大多数体系结构。我将努力仔细地激发下面的陈述 首先要注意的是: 6.2.5类型 对于每个有符号整数类型,都有一个对应的 不同)无符号整数类型(用关键字指定 未签名)使用相同存储

不使用
限制
库,这是确定整数最大值的安全方法吗

int max_int = (unsigned int) -1 >> 1;

我相信你提出的准则:

int max_int = (unsigned int) -1 >> 1;
确定有符号整数类型的最大值不是一种安全的方法(根据标准),但它肯定适用于大多数体系结构。我将努力仔细地激发下面的陈述

首先要注意的是:

6.2.5类型

  • 对于每个有符号整数类型,都有一个对应的 不同)无符号整数类型(用关键字指定 未签名)使用相同存储量(包括签名) 并具有相同的对齐要求。

  • 有符号整数类型的非负值范围是相应无符号整数类型的子范围,并且 每种类型中相同值的表示形式相同。A. 涉及无符号操作数的计算永远不会溢出,因为 无法由结果无符号整数表示的结果 类型按比最大值大一的数的模减少 可由结果类型表示的值

标准的这些行确保将
(unsigned int)-1
转换为
UINT\u MAX
。然后是:

6.5.7位移位运算符

  • E1>>E2的结果是E1右移位E2位位置。如果E1具有无符号类型或如果E1具有有符号类型和非负 值,结果的值是 E1/2^E2
确保数字的值除以2。现在是一个棘手的问题。根据以下规定:

6.2.6.2整数类型

  • 对于无符号字符以外的无符号整数类型,对象表示的位应分为两组:值位 和填充位(不需要任何后者)。如果有N 值位,每个位应代表1之间2的不同幂 和2N-1,以便该类型的对象能够 使用纯二进制表示从0到2N-1的值 代表性;这称为值表示。这个 未指定任何填充位的值
  • 对于有符号整数类型,对象表示的位应分为三组:值位、填充位和 符号位。不需要任何填充位;肯定会有 一个符号位。作为值位的每个位应具有相同的值 作为对应对象表示中的相同位 无符号类型(如果有符号类型中有M个值位,而有符号类型中有N个值位
    无符号类型,然后是M,这会导致实现定义的行为。您为什么要这样做?
    限制。h
    是ISO规范强制要求的,您可以保证在任何符合标准的编译器套件中都可以使用它。实际上,不,它不是,我误读了代码。@OliCharlesworth我相信它可能会触发实现定义行为,请参见下面的我的答案可能重复的应该是注释。OP询问如何;无限制。h.问题是没有使用限制库。那么什么时候这不是一种安全的方法?看起来它总是被定义的。@self。当您在执行
    无符号int
    的值位数不超过1的实现时
    int
    的值位数行为是由实现定义的。我认为这是不安全的,因为您不能确保仅基于C标准的程序具有唯一的行为。@self。我不确定我是否理解您的评论。OP询问其行是否是确定
    int\u MAX
    的安全方法。答案是not安全,因为你假设一个位的移位,根据标准,在某些实现上可能是错误的。我真的不明白标准库是从哪里来的。。。