#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结果,但是如何以及为什么?
答案 0 :(得分:2)
这不是明确定义的行为。标准6.3.1.3§3的相关部分:
否则,新类型已签名且无法表示该值 在里面;结果是实现定义的还是 实现定义的信号被提出。
这意味着结果取决于编译器。也许,你的编译器尝试基于二进制补码的某种环绕 - 这是最常见的行为。这不是未定义的行为。
请注意,char
类型可以是有符号也可以是无符号,这也取决于编译器。