如何在c ++中检测unsigned char变量的溢出?
答案 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。