【发布时间】:2013-01-09 10:57:08
【问题描述】:
我有一个文件已读入数据类型为signed char 的数组中。我无法改变这个事实。
我现在想这样做:!((c[i] & 0xc0) & 0x80) 其中c[i] 是签名字符之一。
现在,我从C99 standard 的第 6.5.10 节知道“[按位与] 的每个操作数都应具有整数类型。”
C99 规范的第 6.5 节告诉我:
一些运算符(一元运算符 ~ 和二元运算符 > 、 & 、 ^ 和 | , 统称为按位运算符)应具有整数类型的操作数。 这些运算符返回 取决于整数内部表示的值,以及 因此对于签名类型具有实现定义的方面。
我的问题有两个:
由于我想使用文件中的原始位模式,如何将我的
signed char转换/转换为unsigned char以使位模式保持不变?在任何地方(比如 MVSC 和 GCC)是否有这些“实现定义的方面”的列表?
或者您可以采取不同的路线,并争辩说对于c[i] 的任何值,这对于有符号和无符号字符都会产生相同的结果。
我自然会奖励参考相关标准或权威文本,劝阻“知情”猜测。
【问题讨论】:
-
不引用标准或任何东西,但你不在这里回答你自己的问题吗? “我如何转换/投射”
-
@fge,不知道能不能保证成功。
-
@Richard 如果您进行类型转换,那么位模式不能保持不变。
-
请注意
!((c[i] & 0xc0) & 0x80)等价于!(c[i] & 0x80),两个and没有意义。 -
我不是语言律师类型,但从有符号类型到无符号类型的 IIRC 转换是明确定义的(我认为它被定义为添加 INT_MAX+1 以使结果为正,并且作为无符号值包装,一切都按预期工作)。
标签: c bit-manipulation