【问题标题】:What does it mean by "if the value can be represented by the new type"?“如果值可以用新类型表示”是什么意思?
【发布时间】:2020-10-14 16:32:22
【问题描述】:

在 C11 标准中

6.3.1.3 有符号和无符号整数

1 当一个整数类型的值被转换为另一个整数类型时 除 _Bool 以外,如果该值可以用新类型表示,则 没有改变。

2 否则,如果新类型是无符号的,则将值转换为 反复加或减一大于最大值 可以用新类型表示,直到值在 新类型。 60)

3 否则,新类型有符号,值不能 代表其中;结果要么是实现定义的,要么是 引发了实现定义的信号。

第一点,

  • 我想知道第一点中的“如果值可以用新类型表示”是什么意思?两种整数类型可能具有不同的整数范围,但可以具有相同的位表示范围。 (例如,unsigned int 和 int。)

  • 位表示和整数值在转换前后都没有变化吗?

谢谢。

【问题讨论】:

  • 如果值为 30000,并且您将其转换为 8 位有符号字符,则该新类型不足以容纳 30000 的值,因此该值不能由新的类型。
  • 每个整数类型都有一个相关的可表示值范围。该范围之外的数学整数不能由该类型表示。例如,int8_t(如果实现支持)的范围为 -128 到 127。
  • 如果您将UINT_MAX 存储在int 对象中,则结果将是实现定义的,或者可能会引发实现定义的信号。 “实现定义”意味着实现必须记录它实际做了什么,例如:gcc.gnu.org/onlinedocs/gcc/…
  • 假设CHAR_BIT == 8(每字节8位),那么unsigned char可以表示0到255之间的值,signed char可以表示-128127之间的值.
  • @AndreasWenzel signed char 不保证能够代表-128

标签: c type-conversion integer


【解决方案1】:

C 标准没有规定整数的一种特定表示形式。虽然您可能遇到的大多数实现都对有符号整数使用二进制补码,但这并不能保证。它还允许一个补码,其中对数字取反意味着反转所有位(并且 not 像二进制补码那样加 1),或者在对数字取反意味着仅反转高位时使用符号和大小。

因此,标准语言讨论的是整数在转换时的,而不是表示

例如,假设 int 的范围为 -231 到 231-1,unsigned int 的范围为 0 到 232-1。如果您有一个值为 45 的 int 转换为 unsigned int,则该值可以用两种类型表示,所以现在您有一个值为 45 的 unsigned int

现在假设您的 int 的值为 -1000。该值不能在unsigned int 中表示,因此必须按照第 2 条中的规则进行转换,即将 232 添加到 -1000 以产生 232 sup> - 1000 == 4294966296。现在在二进制补码表示中,值为 4294966296 的 unsigned int 和值为 -1000 的 int 恰好具有相同的表示形式,即十六进制的 FFFFFC18。这种等价性适用于一个人的补码或符号和大小。

因此,将数字转换为不同的类型可能会也可能不会更改表示形式,具体取决于实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 2015-01-03
    相关资源
    最近更新 更多