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