为什么这个程序会导致溢出?

Ani*_*amy 3 c

#include <stdio.h>
int main(void)
{
    char test = 0x80;
    printf("%c\n", test);  /* To remove the "unused" warning */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道一个字符保证是一个字节.0x80也是一个字节.那么为什么我会收到以下错误/警告?

错误:隐式常量转换溢出[-Werror = overflow]

在我的情况下,这是一个错误,因为我将警告视为错误.

0x80是出现此警告/错误的最小值.如果我将其更改为0x7F,则编译正常.我使用ideone.com和'C99 strict'选项来编译代码.据报道使用gcc-4.7.2.

Jon*_*Jon 14

char类型在您的编译器中签名,因此即使它具有8位信息,也不能存储大于127(0x7f)的值.

标题<limits.h>定义了用于确定整数类型的符号和范围限制的宏,包括char.