ChatGPT解决这个技术问题 Extra ChatGPT

位运算符和“字节序”

endianness 与按位运算有关系吗? logical 还是转移?

我正在做有关按位运算符的作业,但我无法对它做出正面或反面,而且我认为我对字节序非常感兴趣。也就是说,我正在使用一个小端机器(就像大多数机器一样),但这是否需要考虑或者这是一个浪费的事实?

万一这很重要,我正在使用C。

恕我直言,这些是略有不同的问题。这个问题就像“128 << 2 == 512 在任何 CPU 上吗?”,这个问题就像“128 << 2 在任何 CPU 上都布置成 0x02 0x00 吗?”。

M
Michael

字节序仅对内存中数据的布局很重要。一旦要操作的处理器加载数据,字节序就完全无关紧要了。无论字节顺序如何,移位、按位运算等都按您预期的方式执行(数据逻辑布局为从低位到高位)。


逻辑上不应该是“从高到低位”吗?
@legends2k:有同样的想法
@legends2k:是的。左移 = 乘以 2 的幂。右移 = 除以 2 的幂(对于负值,舍入与整数除法不同)。
@JoshC:不,PDP-10 只会按照在数据上逻辑定义的方式执行操作,而不管其内存/寄存器中的确切位置是哪个位。考虑一下:当您添加两个 32 位整数时,您不必担心处理器必须转换数据才能使加法工作(也不必担心硬件中字节中的位顺序)- ALU 只是做“正确的事情”,因为它的连接方式与其硬件兼容。移位是相同的方式——它们以抽象出硬件的字节/位顺序细节的方式对数据进行操作。
@JoshC:(续)在C语言中,位移运算符的定义方式更加抽象:它们是根据它们产生的值来定义的,而不是根据它们移动底层位的方式(因此,如果您在某个晦涩的平台上,其中硬件位移指令会产生无效的位布局,例如,您已将值位移动到填充位,则需要符合要求的编译器来生成可以解决该问题的指令,如我明白了)。
l
legends2k

位运算符抽象出字节顺序。例如,>> 运算符总是将位移向最低有效位。但是,这并不意味着在使用它们时完全忽略字节序是安全的,例如,在处理较大结构中的单个字节时,您不能总是假设它们会落在同一个地方。

short temp = 0x1234;
temp = temp >> 8;

// on little endian, c will be 0x12, on big endian, it will be 0x0
char c=((char*)&temp)[0];

为了澄清,我对这里的其他答案没有基本的分歧。我要强调的一点是,尽管位运算符本质上是字节序中性的,但您不能忽略代码中字节序的影响,尤其是与其他运算符结合使用时。


您基本上不同意每个人,但您的答案被评为最佳。如何识别行为?
我添加了一些进一步的说明
因此,为了进一步澄清,您的意思是,除非我实际上以字节为单位检索值,否则一切正常?
哦,所以 >> 和 << 根本不是右移或左移;它们“向最不重要的方向转变,向最重要的方向转变”。这使得“通过移位的除法和乘法”字节顺序独立......现在我很困惑,如果通过 memcpy 进行投射会搞砸这个。
r
rpetrich

正如其他人所提到的,移位由 C 语言规范定义并且与字节顺序无关,但是右移位的实现可能会因架构使用一个补码或二进制补码算法而异。


P
Peter Mortensen

这取决于。无需将数字转换为新类型,您就可以透明地处理字节顺序。

但是,如果您的操作涉及一些新的类型转换,请谨慎使用。

例如,如果您想右移一些位并(显式或不显式地)转换为新类型,字节序很重要!

要测试您的字节顺序,您只需将 int 转换为 char

int i = 1;

char *ptr;

...

ptr = (char *) &i;  //Cast it here

return  (*ptr);

...或者创建一个联合... {union { int i = 1; char a[4];} b;return b.a[3] == 1;} //big endian
m
mmx

您没有指定一种语言,但通常情况下,诸如 C 之类的编程语言在按位运算中抽象字节序。所以不,在按位运算中并不重要。


鉴于这个问题没有修改,我很惊讶你说他没有提到语言,当他提到时,它也被标记为 C。
@Simeon:我写这个答案时没有。单个作者在短时间内的编辑将合并为一个。这就是为什么您将其视为单个修订版的原因。