2016-10-03 86 views
0
#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的带符号字符时会发生什么?它没有环绕,因为它是未定义的行为,但真正发生了什么?C中的类型转换混淆

我得到-1的结果,但如何和为什么?

+1

你在问未定义行为会发生什么?真的吗? –

+0

这不是未定义的行为,而是定义了实现。所以这取决于你的编译器。 –

+0

@JensGustedt将char传递给%d,好吗? –

回答

3

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

否则,新类型有符号且其值不能表示为 ;结果是实现定义的或实现定义的信号被引发。

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

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