【问题标题】:Why is SCHAR_MIN defined as -127 in C99?为什么 SCHAR_MIN 在 C99 中定义为 -127?
【发布时间】:2011-12-22 01:00:12
【问题描述】:

C99 的§5.2.4.2.1 将SCHAR_MIN 定义为-127,将SCHAR_MAX 定义为127。8 位有符号整数的范围不应该是-128 到+127 吗?

我的编译器的 limits.h 将 SCHAR_MIN 定义为 (-1 << ((CHAR_BIT)-1)),如果 CHAR_BIT 为 8,则为 -128。

SCHAR_MIN 被定义为 -127 而不是 -128 有什么原因吗?

【问题讨论】:

    标签: c char language-lawyer c99


    【解决方案1】:

    它实际上并未将SCHAR_MIN 定义为-127,而是将有符号字符的最小范围定义为-127..127。

    它这样做是因为它必须能够处理 other 两种用于有符号数字的编码方案,即反码和符号/大小。这两个都有一个正负零,偷走了你在二进制补码中找到的 -128。

    ISO C (C99),6.2.6.2/2 部分指出,实现必须为有符号整数数据类型选择以下三种不同表示形式之一:

    • 二进制补码;
    • 个数的补码;或
    • 符号/大小

    两者的互补实现远远超过其他实现,但其他实现确实存在。

    在所有这些表示中,正数是相同的,唯一的区别是负数。

    要获得正数的负表示,您:

    • 将所有位取反,然后为二进制补码加一。
    • 将所有位反转为反码。
    • 仅反转符号/大小的符号位。

    您可以在下表中看到 5 和 0:

    号码 |二进制补码|补码|符号/大小 =======|======================|==================== =|===================== 5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101 -5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101 | | | 0 | 0000 0000 0000 0000 | 0000 0000 0000 0000 | 0000 0000 0000 0000 -0 | 0000 0000 0000 0000 | 1111 1111 1111 1111 | 1000 0000 0000 0000 (没有区别)(这两个都有不同的 +/-0)

    【讨论】:

    • 从技术上讲,它是 Ones' 补码,而不是 One's 补码。有区别:-)。
    • 我的参考是计算机编程的艺术。区别在于 Ones' 补码是针对一长串一,而 Two's 补码不是针对一长串二。
    • @Alok:我的权威是谷歌的前八名 :-) 但我检查了 TAOCP 的第 2 卷,你是对的。我也更倾向于听 Knuth 而不是 一百 个互联网页面,所以我会修改它。我会注意到 ISO 标准本身使用 Knuth 的符号。还是应该是 Knuths 的符号? :-)
    • @paxdiablo:只有当您指的是一长串 Knuths 时,它才应该是 Knuths。
    • 你对每个数字取一个补码,所以整个数字是许多个的补码,成为一个补码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2021-09-09
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多