C语言中的类型转换混乱


#include <stdio.h>
int main()
{
    char c = 255;
    if (c > 128)
    {
        printf("This is unsigned number %dn", c);
    }
    else
    {
        printf("This is signed number %dn", c);
    }
}
在这种情况下,当我们初始化一个范围从-127到128的带255的有符号字符时,会发生什么?它没有绕起来,因为它是未定义的行为,但真正发生了什么?

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

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

否则,新类型是有符号的,不能表示该值在它;结果要么是实现定义的,要么是触发实现定义的信号。

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

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

相关内容

  • 没有找到相关文章

最新更新