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

时间:2013-04-17 09:35:12

标签: c

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

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

  

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

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

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

2 个答案:

答案 0 :(得分:14)

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

标题<limits.h>定义了一些宏,可让您确定整数类型的签名和范围限制,包括char

答案 1 :(得分:2)

变量test定义为char,默认为signed char。范围为0~127(7位)。最后一位保留用于签名。可能错误是由于尝试打印具有负值的字符(0x80 = -128)。

尝试使用unsigned char进行测试,并检查是否出现相同的错误。