【问题标题】:Why C standard defines range of data types one short?为什么 C 标准定义了一个短的数据类型范围?
【发布时间】:2012-10-18 14:54:47
【问题描述】:

C99 标准以下列方式定义数据类型的范围:

— minimum value for an object of type signed char
SCHAR_MIN -127 // −(2^7 − 1)
— maximum value for an object of type signed char
SCHAR_MAX +127 // 2^7 − 1
— maximum value for an object of type unsigned char
UCHAR_MAX 255 // 2^8 − 1
— minimum value for an object of type char
CHAR_MIN see below
— maximum value for an object of type char
CHAR_MAX see below
— maximum number of bytes in a multibyte character, for any supported locale
MB_LEN_MAX 1
— minimum value for an object of type short int
SHRT_MIN -32767 // −(2^15 − 1)
— maximum value for an object of type short int
SHRT_MAX +32767 // 2^15 − 1
— maximum value for an object of type unsigned short int
USHRT_MAX 65535 // 2^16 − 1
— minimum value for an object of type int
INT_MIN -32767 // −(2^15 − 1)
— maximum value for an object of type int
INT_MAX +32767 // 2^15 − 1
— maximum value for an object of type unsigned int
UINT_MAX 65535 // 2^16 − 1
— minimum value for an object of type long int
LONG_MIN -2147483647 // −(2^31 − 1)
— maximum value for an object of type long int
LONG_MAX +2147483647 // 2^31 − 1
— maximum value for an object of type unsigned long int
ULONG_MAX 4294967295 // 2^32 − 1

如果我们看到负值范围,它实际上可能比这里定义的值多一,根据允许的二进制恭维表示。为什么要这样定义?

【问题讨论】:

  • 这些尺寸是在标准中定义的?哪个部分?
  • 二进制补码不是 AFAIK 的要求。
  • 可能是允许 1s 补码和 2s 补码。
  • 我不确定是否意味着标准,而是 ANSI limits.h
  • 问题Why does INT_MIN = -INT_MIN in a signed twos complement representation NOT 与此问题重复。那里的答案严格来说是关于 2 的补码算法;这里的答案是“因为除了 2 的补码算术之外还有其他二进制算术系统:”。

标签: c


【解决方案1】:

如果我们看到负值范围,它实际上可能比此处根据允许的二进制补码表示定义的值多一。为什么要这样定义?

因为 C 也是为旧的(和新的!)架构设计的,它们不一定对有符号整数使用二进制补码表示。 C11 标准确实允许三种表示形式(其中适用的是实现定义的):

§ 6.2.6.2 整数类型

如果符号位为1,则通过以下方式之一修改该值:

——符号位为 0 的对应值取反(符号和幅度
— 符号位的值为 -(2M ) (two's complement);
— 符号位的值是 -(2M - 1) (ones'complement)。

所以,用一个的补码表示,最小值是-(2^M - 1)。但是,有一个例外:C99 可选类型 intxx_t,保证以二进制补码表示形式存储(这就是为什么存在可选类型:C 标准不强制这种表示形式)。

【讨论】:

    【解决方案2】:

    因为不需要补码。 C99 可以在具有符号位和幅度或补码的架构上实现。

    【讨论】:

    • C 标准只允许二进制补码、二进制补码或符号和幅度作为有符号整数表示
    • @Christoph 是在标准中明确说明还是仅由limits.h 中的最小值暗示?我记得上次我深入研究并阅读 C11 标准,就像魔鬼阅读圣经一样,我们甚至可以找到二进制补码假设(不过,轶事警告,我不记得在哪里,也找不到关于它的讨论) .
    • 您知道是否曾经为实际的非二进制补码平台创建了任何实现[不包括虚拟机,其主要目的是能够声称并非所有 C99 实现都使用二进制补码表示]?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多