3
#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,则可以正常编译。我使用带有“C99 strict”选项的ideone.com来编译代码。它报告使用 gcc-4.7.2。

4

2 回答 2

14

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

标头<limits.h>定义了允许您确定整数类型的符号和范围限制的宏,包括char.

于 2013-04-17T09:36:14.330 回答
2

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

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

于 2013-04-17T09:48:10.193 回答