溢出检测 如何检测C++中的无符号字符变量的溢出?< p>,可以使用括号初始化值以强制编译时错误(假设您使用C++ 11或更高版本):

溢出检测 如何检测C++中的无符号字符变量的溢出?< p>,可以使用括号初始化值以强制编译时错误(假设您使用C++ 11或更高版本):,c++,char,overflow,unsigned,C++,Char,Overflow,Unsigned,大括号初始化不允许缩小转换范围 当然,这仍然不允许将值260粘贴到无符号字符中,但它会引起注意。您需要更大的数据类型,例如,unsigned short,以表示260 无符号字符测试=260 因为260是整数文本,所以编译器应该发出警告。怎么处理不要忽略编译器警告(或使用替代语法避免自动转换或将此警告作为错误启用)。还请注意,整数文本始终为正(无符号):-1不是整数文本:它是i.l.1和一元运算符-。对于gcc,我建议使用-Wstrict overflow=2(或更多,根据您的代码策略),并可能

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

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

无符号字符测试=260

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

如何检测C++中的无符号字符变量的溢出? 编译时编译器警告是您的朋友,但在运行时编译器警告是您的朋友

没有一种可移植的方法(例如,C#中的checked)来实现这一点,更好的技术取决于您要监视的操作类型。对于一个简单的赋值(使用运行时已知的值进行赋值),您可以这样写:

int32_t bigNumber = 260;
uint8_t smallNumber = static_cast<uint8_t>(bigNumber);
if (static_cast<int32_t>(smallNumber) != bigNumber) {
    // Overflow...
}
请注意,您还可以使编译器更容易编写(分配后):

它之所以有效,是因为自动升级会将
smallNumber
转换为
bigname
类型(除非您正在执行有符号/无符号比较,在这种情况下,您应该避免使用此选项)


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

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

首先,
unsigned char
的范围从0到255,您已将其赋值为260。使用默认设置编译后,gcc和g++将发出
警告:大整数隐式截断为unsigned type[-Woverflow]
这可能会对我有所帮助。谢谢,我猜,您的意思是
无符号字符
的值在0到255之间,但即使这样也是错误的:没有限制
字符
的大小为8位。只要求
char
至少有8位(并且
无符号char
中的位数与
char
中的位数匹配)。@SudipDas实际有符号char不需要在范围[-128…127]内,范围由实现定义(请注意,并非所有体系结构在C2中都表示负数). 也就是说,这是如何回答这个问题的?
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
}