繁体   English   中英

检测溢出

[英]Detection of overflow

如何检测C ++中未签名的char变量的溢出?

未签名的字符测试= 260;

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

如何检测C ++中未签名的char变量的溢出?

在编译时,编译器警告是您的朋友,但在运行时呢?

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

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系列功能(但是请注意,在这种情况下,不会抛出赋值和强制转换)。

无符号数始终在0到255之间为正,并遵守定律2 ^ n(n =类型中的位数);如果char为8位,则无符号char变量的值在0到255之间,而有符号char的值在-128到之间127。

您可以使用花括号来初始化您的值,以强制发生编译时错误(假设您使用的是C ++ 11或更高版本):

unsigned char Test{260};

括号初始化不允许缩小转换范围。

当然,这仍然不允许将值260粘贴到unsigned char但是会引起人们的注意。 您需要更大的数据类型,例如unsigned short ,以代表260。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM