鱼C论坛

 找回密码
 立即注册
查看: 51|回复: 1

实验5(4)点 N个字节占多大空间??

[复制链接]
发表于 前天 16:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
(N/16+1)*16 ?=((N+15)/16)*16
此时N/16必有大于等于1且小于16的余数m,((N+15)/16)*16=((N-m/16)+(m)/16+15/16)*16,15/16怎样来的???
其中N-m/16能被16整除,(m+15)/16相当于+1.  ????
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 16:55 | 显示全部楼层
实验5(4)点 N个字节占多大空间??
(N/16+1)*16 ?=((N+15)/16)*16
此时N/16必有大于等于1且小于16的余数m,((N+15)/16)*16=((N-m/16)+(m)/16+15/16)*16,15/16怎样来的???
其中N-m/16能被16整除,(m+15)/16相当于+1.  ????


首先,你提到的两个表达式都是为了计算将 N 个字节对齐到 16 字节边界后占用的空间大小。但这两个表达式并不完全等价,第二个表达式才是正确的。

1. 对齐的概念
在内存分配或结构体对齐中,经常需要将数据大小向上取整到某个对齐值(这里是 16)的倍数。即如果 N 不是 16 的倍数,则补充一些空闲字节,使其变为 16 的倍数。

对齐后的空间大小 = ceil(N / 16) * 16,其中 ceil 表示向上取整。

2. 两个表达式的分析
假设使用整数除法(只取商,舍去小数部分):

(N/16 + 1) * 16
- 当 N 是 16 的倍数时,N/16 正好是整数,加 1 后再乘 16 会多出 16 字节,这不符合对齐要求(因为此时 N 本身已是 16 的倍数,不需要额外空间)。
- 当 N 不是 16 的倍数时,这个表达式能得到正确的对齐大小,但它对边界情况处理错误。

((N + 15) / 16) * 16
- 这个表达式对所有 N 都正确,包括 N 是 16 的倍数的情况。

3. 为什么第二个表达式正确?
N = 16 * q + r,其中 q 是商,r 是余数(0 ≤ r ≤ 15)。

N + 15 = 16q + r + 15
整数除法 (N + 15) / 16 的结果是:
- 如果 r = 0,则 r + 15 = 15(16q + 15) / 16 = q(因为整数除法舍去小数)。
- 如果 r ≥ 1,则 r + 15 ≥ 16(16q + r + 15) / 16 = q + 1

然后乘以 16:
- 当 r = 0,结果为 16q = N
- 当 r ≥ 1,结果为 16(q + 1) = 16q + 16,这正是大于 N 的最小 16 的倍数。

因此,((N + 15) / 16) * 16 总能得到正确的对齐大小。

4. 关于你的推导
你写:((N+15)/16)*16=((N-m/16)+(m)/16+15/16)*16,这里可能有些混淆。

实际上,在整数运算中,不能直接将 (N+15)/16 拆成 N/16 + 15/16,因为整数除法不是线性运算。

正确的推导方式是使用余数,如上所示。你提到的 15/16 可能源于将 15 单独除以 16,但在整数运算中,15/16 等于 0。实际上,加 15 的技巧是为了让除法结果实现向上取整的效果。

5. 为什么加 15?
对于对齐到 B 字节,一般公式为:((N + B - 1) / B) * B
这里 B = 16,所以加 15。这样,只要 N 不是 16 的倍数,N+15 就会使除法结果增加 1;而当 N 是 16 的倍数时,N+15 还不足以让除法结果增加 1。

6. 示例

  1. N = 32: (32/16+1)*16 = (2+1)*16 = 48(错误,应为32)
  2.        ((32+15)/16)*16 = (47/16)*16 = 2*16 = 32(正确)

  3. N = 33: (33/16+1)*16 = (2+1)*16 = 48(正确)
  4.        ((33+15)/16)*16 = (48/16)*16 = 3*16 = 48(正确)
复制代码


综上,第二个表达式 ((N+15)/16)*16 才是正确的计算方式。第一个表达式在 N 是 16 的倍数时会多算 16 字节。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-7 00:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表