作者Hazukashiine (私は幸せです)
看板C_and_CPP
标题Re: C/C++ 语言新手十三诫 -- Ver. 2016
时间Wed Jun 8 15:37:35 2016
※ 引述《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)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.68.118
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1465371461.A.A9C.html
※ 编辑: Hazukashiine (140.113.68.118), 06/08/2016 15:44:49
1F:推 LPH66: 这里其实还牵扯到一个细节是 C/C++ 没有负的 literal 06/08 15:45
2F:→ LPH66: 所以直接写 -2147483648 基本上是行不通的 06/08 15:45
嗯 没错 我再编辑补充一下 www
3F:→ LPH66: 我好一阵子前写了一个小题目来讲解这回事: 06/08 15:52
5F:推 wtchen: 我这边列的INT_MIN/INT_MAX是Standard制定的 06/08 16:38
哪一份的 Standard 定义 INT_MIN 是 -2147483647 了?
6F:→ wtchen: 当然OS实作或user define可以有别的方法 06/08 16:38
还有 INT_MIN 定义跟 OS 实作有什麽关系?是编译器标头档实作。
还有置底的 C/C++ 语言新手十三诫有很多用词没有很精确的地方。
7F:推 wtchen: 一般linux会做成#define INT_MIN (-INT_MAX - 1) 06/08 16:48
8F:→ wtchen: 稍微改了一下.... 06/08 16:51
9F:→ wtchen: 看看有没有好些.... 06/08 17:23
10F:推 yvb: 如果你去看C99/C11 Standard,你会发现long int (4 bytes)... 06/08 21:53
11F:→ yvb: INT_MIN... 06/08 21:53
12F:→ yvb: 为何我看到的, long int 应该是对应 LONG_MIN 和 LONG_MAX ? 06/08 21:54
13F:→ yvb: 然後 int 才是对应 INT_MIN 和 INT_MAX ... @@ 06/08 21:55
14F:→ yvb: 如果 ... "long int" <== 原文 488 行. 06/08 22:08
15F:→ yvb: 然後C99/C11中, INT_MIN/INT_MAX 的 "范例" 是 -32767/+32767 06/08 22:13
好神奇...
http://www.cplusplus.com/reference/climits/
就是保证 int 至少有 2 bytes 那麽大,而不是 4 bytes...
※ 编辑: Hazukashiine (140.113.68.118), 06/08/2016 22:19:08
16F:推 wtchen: 一开始我也发现这点,所以如果有人更早看到我的更新会发现 06/08 22:21
17F:推 wtchen: 我一开始是用short作例子(因为int有int跟long int两种) 06/08 22:22
18F:→ wtchen: 不过short好像不存在abs,所以才改用int(汗) 06/08 22:22
19F:→ wtchen: 我还是把例子改成long好了(汗) 06/08 22:25
20F:→ wtchen: 不过long有一样的问题,64bit是8byte 06/08 22:26
21F:推 wtchen: 改成long了,这次应该好多了 06/08 22:31
22F:推 wtchen: 用字我也想尽量精准,所以有任何意见请不吝指正 06/08 22:37
嗯嗯 看起来蛮认真编辑的 晚一点再指出是哪边吧 QQ
※ 编辑: Hazukashiine (140.113.68.118), 06/08/2016 22:58:56
23F:推 yvb: 嗯. C99/C11 的 5.2.4.2.1 提到是 implementation-defined, 06/08 23:11
24F:→ yvb: 而数值的绝对值要大於等於该值(比方INT_MAX不可小於+32767). 06/08 23:12
25F:推 wtchen: Standard给的都是"范围至少要怎样",编译器实作只要比较大 06/08 23:24
26F:→ wtchen: 就OK(我有特别注明) 06/08 23:25
27F:→ wtchen: 但是因为范围不对称(差1的情况下)造成像abs这样突然超过 06/08 23:25
28F:→ wtchen: 范围的情况下会出现啥就是未定义 06/08 23:26
29F:推 yvb: 嗯, 因为提到 standard, 就应该照抄, 不能乱改数值 :P 06/08 23:32
30F:→ yvb: 另外, (4 bytes) 也许可以改移到备注, 说明在多数 16-bits 06/08 23:32
31F:→ yvb: 和 32-bits 编译器可能采用; 而 64-bits 可能不同之类. 06/08 23:33
32F:→ wtchen: 因为我手上只有Linux-64bit,Win我不熟不知道状况是否不同 06/08 23:34
33F:→ wtchen: 16bit...我多久没用了.... 06/08 23:35
34F:→ wtchen: 把16/32/64bit的可能情形加进去了 06/08 23:40
35F:→ wtchen: 各位教训的是.... 06/09 01:08