溢出检测

Detection of overflow

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

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

unsigned char Test{260};

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

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

unsigned char Test = 260;

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

How to detect overflow of unsigned char variable in c++?

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

没有可移植的方法(例如,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 类型(除非您正在执行 signed/unsigned 比较,在这种情况下,您应该避免使用此替代方法)。

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

unsigned numbers always positive between 0 to 255.and object the law 2^n(n = numbers of bit in type);if char 8 bit then unsigned char variables have values between 0 and 255, while signed字符的值介于 -128 和 127 之间。