Re: C/C++ 语言新手十三诫 -- Ver. 2016

楼主: Hazukashiine (私は幸せです)   2016-06-08 15:37:35
※ 引述《wtchen (没有存在感的人)》之铭言:
:
: INT_MIN -2147483647 // compiler实作时最小值不可大于 -(2147483648-1)
: ^ ^^^^^^^^^^^^ ^^^^^^^^^^^^^^
: INT_MAX 2147483647 // compiler实作时最小值不可小于 (2147483648-1)
: ^^^^^^^^^^^^ ^^^^^^^^^^^^^^
: 不过由于32bit能显示的范围就是2**32种,所以一般作业系统会把
: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
: INT_MIN多减去1,也就是int 的显示范围为-2147483648 ~ +2147483647。
: 当程式跑到abs(-2147483648)>0时,由于int不存在2147483648,
: 于是正确结果无法被有限的数位显示(undefined behavior) 解释奇怪的地方
:         ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
不知道这样有没有比较好:
  INT_MIN = -2147483648
  INT_MAX = 2147483647
  由于 integer literal 会被视为 int 整数型态
  所以 #define INT_MIN -2147483648 是行不通的(超过 int 上界)
  因此编译器标头档实作时可以定义成 #define INT_MIN (-INT_MAX - 1)
作者: LPH66 (-6.2598534e+18f)   2016-06-08 15:45:00
这里其实还牵扯到一个细节是 C/C++ 没有负的 literal所以直接写 -2147483648 基本上是行不通的我好一阵子前写了一个小题目来讲解这回事:https://paste.plurk.com/show/2283249/
作者: wtchen (没有存在感的人)   2016-06-08 16:38:00
我这边列的INT_MIN/INT_MAX是Standard制定的当然OS实作或user define可以有别的方法一般linux会做成#define INT_MIN (-INT_MAX - 1)稍微改了一下....看看有没有好些....
作者: yvb   2016-06-08 21:53:00
如果你去看C99/C11 Standard,你会发现long int (4 bytes)...INT_MIN...为何我看到的, long int 应该是对应 LONG_MIN 和 LONG_MAX ?然后 int 才是对应 INT_MIN 和 INT_MAX ... @@如果 ... "long int" <== 原文 488 行.然后C99/C11中, INT_MIN/INT_MAX 的 "范例" 是 -32767/+32767
作者: wtchen (没有存在感的人)   2016-06-08 22:21:00
一开始我也发现这点,所以如果有人更早看到我的更新会发现我一开始是用short作例子(因为int有int跟long int两种)不过short好像不存在abs,所以才改用int(汗)我还是把例子改成long好了(汗)不过long有一样的问题,64bit是8byte改成long了,这次应该好多了用字我也想尽量精准,所以有任何意见请不吝指正
作者: yvb   2016-06-08 23:11:00
嗯. C99/C11 的 5.2.4.2.1 提到是 implementation-defined,而数值的绝对值要大于等于该值(比方INT_MAX不可小于+32767).
作者: wtchen (没有存在感的人)   2016-06-08 23:24:00
Standard给的都是"范围至少要怎样",编译器实作只要比较大就OK(我有特别注明)但是因为范围不对称(差1的情况下)造成像abs这样突然超过范围的情况下会出现啥就是未定义
作者: yvb   2016-06-08 23:32:00
嗯, 因为提到 standard, 就应该照抄, 不能乱改数值 :P另外, (4 bytes) 也许可以改移到备注, 说明在多数 16-bits和 32-bits 编译器可能采用; 而 64-bits 可能不同之类.
作者: wtchen (没有存在感的人)   2016-06-08 23:34:00
因为我手上只有Linux-64bit,Win我不熟不知道状况是否不同16bit...我多久没用了....把16/32/64bit的可能情形加进去了各位教训的是....

Links booklink

Contact Us: admin [ a t ] ucptt.com