【问题标题】:Type conversion confusion in C [duplicate]C中的类型转换混淆[重复]
【发布时间】:2017-02-11 07:48:15
【问题描述】:
#include <stdio.h>

int main()
{
    char c = 255;
    if (c > 128)
    {
        printf("This is unsigned number %d\n", c);
    }
    else
    {
        printf("This is signed number %d\n", c);
    }
}

当我们用 255 初始化一个范围从 -127 到 128 的有符号字符时,在这种情况下会发生什么?它不会环绕,因为它是未定义的行为,但真正发生了什么?

我得到 -1 结果,但如何以及为什么?

【问题讨论】:

  • 您在问未定义的行为会发生什么?认真的吗?
  • 这不是未定义的行为,而是已定义的实现。所以这取决于你的编译器。
  • @JensGustedt 正在将 char 传递给 %d,好吗?
  • @GiorgiMoniava,是的,所有窄类型在传递给va_arg 函数时都会转换为int

标签: c type-conversion unsigned signed


【解决方案1】:

这不是明确定义的行为。标准 6.3.1.3 §3 的相关部分:

否则,新类型有符号,值无法表示 在里面;结果是实现定义的或 引发了实现定义的信号。

这意味着结果取决于编译器。可能,您的编译器会尝试基于二进制补码的某种环绕——这是最常见的行为。这不是未定义的行为。

请注意char 类型可以是有符号的也可以是无符号的,这也取决于编译器。

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多