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

Posted

技术标签:

【中文标题】错误:隐式常量转换溢出 [-Werror=overflow]【英文标题】:error: overflow in implicit constant conversion [-Werror=overflow] 【发布时间】:2013-05-16 05:59:59 【问题描述】:

#include<stdio.h>

int main()
 
    char ch=200;
    printf("\n%d",ch);
    return 0;

我在http://ideone.com/YNkKT6#view_edit_box 上运行此代码并得到隐式转换错误。 我需要进行哪些修改,原因是什么?

【问题讨论】:

【参考方案1】:

n3376 3.9.1/1

普通字符、有符号字符和无符号字符是三种不同的类型。 字符、有符号字符和无符号字符 unsigned char 占用相同的存储量并具有相同的对齐要求(3.11);那是, 它们具有相同的对象表示。

什么是char 是实现定义的,所以这里需要unsigned char,它处理值(0-255)。

【讨论】:

【参考方案2】:

看起来你的charsigned char,它接受从-128 到127 的值。而200 太大了,会溢出成为负数。

要修复它,请将 char 更改为 intunsigned char

int main()
 
    unsigned char ch=200;
    printf("\n%d",ch);
    return 0;

【讨论】:

char从不signed charchar 可以是有符号或无符号(实现定义),但它始终是不同于 signed charunsigned char 的类型。 这是一个没有区别的区别:C 代码的行为在任何情况下都无法与 char 区别开来,signed charunsigned char 的同义词。 (我对 C++ 不太确定。)

以上是关于错误:隐式常量转换溢出 [-Werror=overflow]的主要内容,如果未能解决你的问题,请参考以下文章

C++:隐式常量转换中的溢出 [-Woverflow]

row_number()over(partition by 后面加数字型字段提示varchar 转换number 算术溢出错误

错误:赋值从没有强制转换的指针生成整数 [-Werror] str1 = (unsigned char*)s1

为啥首先允许指针从非常量到常量的隐式转换?

记录: 一次解决整型溢出攻击(使用scala,隐式转换)

从非常量到常量模板参数的隐式转换在 boost::optional 中不起作用