【发布时间】: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可以表示-128和127之间的值. -
@AndreasWenzel
signed char不保证能够代表-128。
标签: c type-conversion integer