【发布时间】:2013-09-20 17:31:28
【问题描述】:
在带有 Linux 的 x86 机器上使用 gcc 4.5.2 编译时,以下内容不会给我任何警告:
char foo = 255;
但是当我使用-pedantic 时,gcc 会说:
警告:隐式常量转换溢出
gcc 的行为方式有点奇怪,这让我怀疑我是否真的理解这个作业中发生的事情。我认为如果 char 在 POSIX 上是 8 位长并且默认签名,它不能容纳 255。
在 C 标准中,它说无符号整数溢出会导致溢出,但有符号整数溢出是未定义的。那么这个赋值是未定义的行为吗?为什么 gcc 会这样?
【问题讨论】:
-
某处我读到只有真正的过度流 是UB,因此,赋值运算符没有调用未定义的行为,但我不确定。无论如何都要为这个问题 +1。
-
但是在此之后您是否尝试打印
foo?你得到了什么价值? -
警告只是让您知道该数字不是您设置的数字,而不是警告任何未定义的行为,但更一般的问题很有趣。我的直觉说它是未定义的(因为
foo已签名,所以它在运行时是未定义的),但我不知道。 -
@Dave 该答案中的哪一行确实说它未定义?
-
@Smac89:它会打印“垃圾”,因为 ASCII 字符中没有这样的符号,但您可以使用这样的值来组成 Unicode 字符