标准中哪里说当你进行按位运算时,它的行为会像大尾数法?

bas*_*d21 5 c bit-manipulation bit-shift

无论字节序如何,位移和其他操作的行为总是像大字节序一样。所以小的数字在右边,大的数字在左边。符号位也位于左侧。

我的问题是哪里明确说是这样的?我的C11草案副本甚至没有提到字节顺序,并且在按位部分有一些我不理解的数学表达式,所以我不确定这部分在哪里。

Eri*_*hil 10

\n

无论字节序如何,位移和其他操作的行为总是像大字节序一样。

\n
\n

不,他们没有。\xe2\x80\x9cEndian\xe2\x80\x9d 指的是对象的字节(有时是位)在内存中的存储方式。C 标准中指定的位移位和按位运算符对值进行操作,而不考虑它们在内存中的存储方式,因此不涉及字节顺序。

\n

移位运算符通过其通用名称将较大的位置值与左侧的位关联起来,将较小的位置值与右侧的位关联起来(\xe2\x80\x9cleft shift\xe2\x80\x9d 和 \xe2\x80\x9cright shift\xe2\x80\x9d)以及 C 标准中规范中的一些术语,但此约定仅指人类如何编写二进制数字。它对如何将值的表示形式写入内存没有影响。

\n

例如,考虑unsigned int x = 1u << 24;使用 32 位unsigned int. 1 将左移,产生值 2 24,该值可以用二进制写为 00000001000000000000000000000000 。当写入内存时,C 实现可能以 1, 0, 0, 0(对于大端顺序)或 0, 0, 0, 1(对于小端顺序)的顺序存储字节。内存中的顺序与值无关,在任何符合32 位的C 实现中,该值仍然是 00000001000000000000000000000000 2 。unsigned int

\n


Vla*_*cow 2

从按位移位运算符的描述可以直接得出结果不依赖于整数的存储方式。

\n

C11 标准(6.5.7 移位运算符)

\n
\n

4 E1 << E2的结果是E1左移E2位位置;空出的位用零填充。如果 E1 具有无符号类型,则结果的值为 E1 \xc3\x97 2E2,比结果类型中可表示的最大值多减模 1。如果 E1 具有带符号类型和非负值,并且 E1 \xc3\x97 2E2 可在结果类型中表示,\n则这就是结果值;否则,行为是未定义的。

\n

5 E1 >> E2 的结果是 E1 右移 E2 位位置。如果 E1\n 具有无符号类型,或者 E1 具有符号类型和非负\n值,则结果的值是\nE1 / 2E2 的商的整数部分。如果 E1 具有带符号类型和负值,则结果\n值是实现定义的。

\n
\n

否则,C 标准中将会有一个与整数在内存中存储方式相关的注释。

\n