#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
类型可以是有符号的也可以是无符号的,这也取决于编译器。