[英]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.