C++ 在C+中使用字符溢出合法吗+;代码

C++ 在C+中使用字符溢出合法吗+;代码,c++,C++,各位同事,你好 我需要获得从0到255的连续数字的循环序列。这样使用无符号字符溢出合法吗: unsigned char test_char = 0; while (true) { std::cout << test_char++ << " "; } 无符号字符测试\u char=0; while(true){ std::cout即使sizeof(char)始终为1,也不需要一个char正好为8位(我猜无符号char也会类似) 因此,在这两种情况中,如果有选择的

各位同事,你好

我需要获得从0到255的连续数字的循环序列。这样使用无符号字符溢出合法吗:

unsigned char test_char = 0;

while (true) {
    std::cout << test_char++ << " ";
}
无符号字符测试\u char=0;
while(true){
std::cout即使sizeof(char)始终为1,也不需要一个char正好为8位(我猜无符号char也会类似)

因此,在这两种情况中,如果有选择的话,我宁愿选择后者,因为前者甚至可能不正确

顺便说一句,对于后者,您可能打算使用无符号int而不是int?带负数的模可能会变得棘手(在int溢出之后,正如Jimmy所指出的)。如果我没记错的话,我相信它依赖于编译器。

3.9.1/4声明为无符号的无符号整数应遵守算术模2n定律,其中n是该特定整数大小的值表示中的位数

“这意味着无符号算术不会溢出,因为无法由结果无符号整数类型表示的结果被减少为大于结果无符号整数类型可以表示的最大值一的数的模。”


因此,是的,它是合法的。第二种形式是首选的,因为它更可读。

无符号字符与所有其他无符号整数类型一样,遵循模2n算术,因此基本上两种方法是等效的。使用第一种形式,两个示例的输出完全不同。 第一个将打印字符(a b c d e f g h…) 第二个将打印整数(0 1 2 3 4…255 0…)
无论如何,这取决于您是否有overflowexception(.NET)控件否则,在旧C++中,该值总是有效的,从0到255

< P> >埃里克引用的每一个3.91/4都没有无符号溢出,但是,正如Moron所说,“代码>未符号CHAR/<代码>数字系统的模数可能大于256。 请注意,您的表达式不会将
%256
的结果存储回
test\u int

test_int = ( test_int + 1 ) % 256;
std::cout << test_int << " ";
test_int=(test_int+1)%256;

std::您是否需要担心第二种情况下的整数换行。换行是通过
无符号int
解决的。而
无符号int
的句点是一个(未指定)256的倍数,因此它是完全安全的。但是位数不能保证为8。但是请注意,char的大小不能保证为8位。它的大小可以保证为一个字节,但是存在这样的体系结构,即1字节的大小不能为8位,因此char在255之后不会溢出。实际上,您不可能不得不这样做e这样一个平台…:)EDIT just beat me@Potatoswatter!不,但他使用的算法仍然是合法的。如果他在一个字符更大的系统上工作,他会很快注意到(如果他使用可读的版本也没关系),谢谢你的回答。当然,我是指后者中的unsigned int。
test_int = ( test_int + 1 ) % 256;
std::cout << test_int << " ";