检测溢出

时间:2015-11-30 16:23:31

标签: c++ char overflow unsigned

如何在c ++中检测unsigned char变量的溢出?

3 个答案:

答案 0 :(得分:1)

  

unsigned char Test = 260;

因为260是整数文字,所以编译器应该发出警告。怎么处理? 不要忽略编译器警告(或使用其他语法来避免自动转换或将此警告设置为错误)。另请注意,整数文字总是正数(无符号):-1不是整数文字:它是i.l. 1和一元运算符-。对于gcc,我建议使用-Wstrict-overflow=2(或更多,根据您的代码政策)并可能启用-Werror=strict-overflow。对于MS VC ++,如果您在级别1(!!!)处保留警告,则可以使用/we4307/W14307启用警告C4307(您也可以使用#pragma warning指令执行此操作。)

  

如何在c ++中检测unsigned char变量的溢出?

在编译时,编译器警告是你的朋友,但运行时

没有可移植的方式(例如,在C#中使用checked)并且更好的技术取决于您要监视<哪种类型的操作/ em>的。对于简单赋值(使用运行时已知的值进行),您可以编写如下内容:

int32_t bigNumber = 260;
uint8_t smallNumber = static_cast<uint8_t>(bigNumber);
if (static_cast<int32_t>(smallNumber) != bigNumber) {
    // Overflow...
}

另外,您可以在分配之前进行检查:

int32_t bigNumber = 260;
if (bigNumber > UINT8_MAX) {
    // Overflow
}

请注意,您也可以使编译器生活更轻松(在分配后):

if (smallNumber != bigNumber) {
    // Overflow
}

它有效,因为自动促销会将smallNumber转换为bigNumber类型(除非您执行签名/未签名的比较,在这种情况下,您应该避免使用此选项)。

如果您经常需要它,您可以编写一个小帮助函数来执行此转换。对于一些想法和可能的实现,如果您正在使用MS编译器,您可以查看SafeInt族函数(但请注意,在这种情况下,赋值和转换不会抛出)。

答案 1 :(得分:1)

无符号数在0到255之间总是正数。遵守法则2 ^ n(n =类型中的位数);如果是字符8位,则无符号字符变量的值介于0和255之间,而有符号字符之间的值为0 -128和127.

答案 2 :(得分:0)

您可以使用大括号初始化值以强制编译时错误(假设您使用C ++ 11或更高版本):

unsigned char Test{260};

支持初始化不允许缩小转换次数。

当然,仍然不允许将值260粘贴到unsigned char中,但它会引起对该尝试的注意。您需要更大的数据类型,例如unsigned short,才能代表260。