C++ 是否有任何理由选择有符号或无符号整数来表示位列表?

C++ 是否有任何理由选择有符号或无符号整数来表示位列表?,c++,c,bit-manipulation,C++,C,Bit Manipulation,是否有任何理由选择有符号或无符号整数来表示位列表 我相信人们更倾向于使用无符号:例如,C++的位集转换为无符号长 这是一个任意的决定,还是无符号更好?最好对表示位的整数使用无符号类型。您经常对这些整数使用位移位运算符,并且这些运算符对无符号整数具有定义良好的行为(前提是移位量不超过位数或负数) 如果对有符号整数使用,则前者具有将值为1的位移入或移出符号位的功能,后者具有为负值定义的实现行为 第6.5.7节p4和p5阐明了这一点: 4E1>E2的结果是E1右移E2位位置。如果E1具有无符号类型,或

是否有任何理由选择有符号或无符号整数来表示位列表

我相信人们更倾向于使用
无符号
:例如,C++的
位集
转换为无符号长


这是一个任意的决定,还是
无符号
更好?

最好对表示位的整数使用无符号类型。您经常对这些整数使用位移位运算符
,并且这些运算符对无符号整数具有定义良好的行为(前提是移位量不超过位数或负数)

如果对有符号整数使用
,则前者具有将值为1的位移入或移出符号位的功能,后者具有为负值定义的实现行为

第6.5.7节p4和p5阐明了这一点:

4
E1>E2
的结果是
E1
右移
E2
位位置。如果
E1
具有无符号类型,或者如果
E1
具有有符号类型和 非负值,结果的值是 E1/2E2的商。如果
E1
具有签名类型和 如果为负值,则结果值由实现定义


但是,您需要注意的一件事是使用小于
int
的无符号类型。这是因为在表达式中使用时,这些类型的值将提升为
int

无符号
保证能够保存任何位的组合<代码>已签名未签名;它可以有填充或陷阱表示。
signed
也不能很好地使用移位运算符,这是处理位字符串时经常需要的。Unsigned也有助于保证溢出的结果。@NateEldredge
signed也不能很好地使用移位运算符
——这就是我要问的。怎么用?当?.@MaxB读取按位移位运算符部分时,会出现大量“…用于有符号和非负…否则行为未定义…”和标准更改-