C中的类型转换混淆

时间:2016-10-03 11:19:20

标签: c type-conversion unsigned signed

#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);
    }
}

在这种情况下,当我们初始化一个范围从-127到128且有255的有符号字符时会发生什么?它没有包裹,因为它是未定义的行为,但究竟发生了什么?

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

1 个答案:

答案 0 :(得分:2)

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

  

否则,新类型已签名且无法表示该值   在里面;结果是实现定义的还是   实现定义的信号被提出。

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

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