首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >翻转字节,做算术,然后再把它们翻转回来

翻转字节,做算术,然后再把它们翻转回来
EN

Stack Overflow用户
提问于 2019-04-30 00:46:01
回答 2查看 226关注 0票数 2

我有一个与编程/数学相关的问题,涉及到大端和小端点之间的转换以及做算术。

假设我们在小endian模式下有两个整数:

代码语言:javascript
复制
int a = 5;
int b = 6;
//a+b = 11

让我们翻转字节并再次添加它们:

代码语言:javascript
复制
int a = 1280;
int b = 1536;
//a+b = 2816

现在,如果我们翻转2816的字节顺序,就会得到11。所以从本质上说,我们可以在小端点和大端点之间进行算术计算,一旦转换,它们表示相同的数字?

在计算机科学的世界里,这有什么理论/名称吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-30 05:30:35

首先,应该注意的是,您假设C中的int有16位是错误的。在大多数现代系统中,int是一种32位类型,所以如果我们反转(而不是翻转,这通常意味着使用补码)的字节数为5,我们将得到83886080 (0x05000000),而不是1280 (0x0500)。

还请注意,您应该用十六进制编写,以便更容易理解,因为计算机不使用十进制:

代码语言:javascript
复制
int16_t a = 0x0005;
int16_t b = 0x0006;
// a+b = 0x000B

int16_t a = 0x0500; // 1280
int16_t b = 0x0600; // 1536
//a+b = 0x0B00

好的,就像其他人说的,ntohl(htonl(5) + htonl(6))碰巧和5+6是一样的,只是因为你有小的数字,它们的反转之和不会溢出。选择更大的数字,你马上就会看到不同之处

但是,该属性 补语中确实适用于将值存储在两个较小部分中的系统,如本例所示。

在一个人的补语中,通过将执行传递回进位,用端向进位做算术。如果由于“循环进位”,只有一个内部的“进位中断”(即存储的值被分成两个独立的块),则使一个人的补足算术端点独立于

假设我们有xxyy和zztt,那么xxyy + zztt就是这样完成的。

代码语言:javascript
复制
            carry
        xx        yy
      + zz <───── tt
      ──────────────
  carry aa        bb
     │             ↑
     └─────────────┘

当我们反转块的时候,yyxx + ttzz也是这样。因为xx,yy,zz,tt是任意长度的比特块,它适用于PDP的混合端点,或者当您将32位数字存储在两个16位部件中,将64位数字存储在两个32位部件中.

例如:

  • 0x7896 + 0x6987 = 0xE21D
    • 0x9678 + 0x8769 = 0x11DE1→0x1DE1 +1= 0x1DE2

  • 0x2345 + 0x9ABC =0xBE 01
    • 0x4523 + 0xBC9A = 0x101BD→0x01BD +1= 0x01BE

  • 0xABCD + 0xBCDE = 0x168AB→0x68AB +1= 0x68AC
    • 0xCDAB + 0xDEBC = 0x1AC67→0xAC 67+1=0xAC 68

或John Kugelman上面的示例: 0x68 + 0x0B = 0x73;0x86 + 0xB0 = 0x136→0x36 +1= 0x37

末端进位是TCP校验和选择一个补码的原因之一,因为它可以方便地计算出较高精度的和。16位CPUs可以像普通的16位单元一样工作,但是32位和64位CPUs可以并行地添加32位和64位块,而无需担心当SIMD不像斯瓦尔技术那样可用时的进位。

票数 0
EN

Stack Overflow用户

发布于 2019-04-30 00:58:35

这似乎只是因为您碰巧选择了足够小的数字,以便它们和它们的和适合于一个字节。只要您的数字中的所有内容都保持在其各自的字节内,显然可以随意地洗牌和解乱您的字节,这不会有什么区别。如果你选择更大的数字,例如1234和4321,你会注意到它不再起作用了。实际上,您很可能会调用未定义的行为,因为您的int会溢出…。

除此之外,您几乎可以肯定地想要阅读以下内容:https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55912523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档