#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。
答案 0 :(得分:14)
char
类型在您的编译器中签名,因此即使它有8位信息,也不能存储大于127(0x7f)的值。
标题<limits.h>
定义了一些宏,可让您确定整数类型的签名和范围限制,包括char
。
答案 1 :(得分:2)
变量test定义为char,默认为signed char。范围为0~127(7位)。最后一位保留用于签名。可能错误是由于尝试打印具有负值的字符(0x80 = -128)。
尝试使用unsigned char进行测试,并检查是否出现相同的错误。