溢出检测
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 之间。
如何在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 之间。