gpt4 book ai didi

CSAPP : What should happen if I want to shift an 8-bit number 8 positions to the left

转载 作者:行者123 更新时间:2023-12-04 10:13:44 25 4
gpt4 key购买 nike

这个问题来自CSAPP CMU ICS 2015Fall Lecture 02 Bits, Bytes, and Integers 19:30和相关的脚本是

The other thing is confusing to people is

What should happen if you say I want to shift an 8-bit number 8 positions to the left

And x is a single byte what do you think you should get

Zero that would be a pretty logical thing you kind of shift all those bits out you fill them with zeros

----------- I don't understand -----------

On most machines you'll get whatever x was

Because what will do is it will compute this number mod 8

And the reason that happens is if you think about it

It's looking at just the lower two three bits of the shift amount and ignoring all the rest

So that's effectively like module 8

So that's just a warning and some machines it does

What you just thought it should and other machines it does this

And so there's no no guarantee and in C that it will be one way or the other



Randal E. Bryant 说,将 8 位数向左移动 8 个位置时有两个结果。 (如我错了请纠正我)
  • 模块 8 不变

  • 我放置了一个水平规则来分隔我不理解的部分。特别是在大多数机器上,你会得到 x 是什么,因为它会计算这个数字 mod 8,我不明白为什么 x 与 x mod 8 相同。

    有人可以对水平规则下方的部分进行更多解释,更好地使用可运行的程序吗?

    SO上有一些相关的问题,例如 What happens with bitwise shift for all 8 bitsLeft shift operation on an unsigned 8 bit integer ,但两者都不包含模块部分。

    最佳答案

    将 8 位字节向左移动 8 个位置可以用不同的方式进行分析:

  • 在算术上,将一个值向左移动 8 个位置是乘以 256,它产生一个 8 个低位全为零的数字,因此当存储回一个 8 位字节时,您会得到 0 .
  • 硬件移位指令通常仅将存储器字移位小于其宽度的位数。在很多架构上,比如intel,这个移位量数是通过屏蔽移位值的高位得到的。因此,将一个字节向左移动 8 个位置的指令实际上将 8 位寄存器或内存参数中的值移动了 8 & 7。位置,所以 0 位,保持值不变。
  • 为了适应硬件限制,C 语言未定义将整数移位大于或等于其宽度的多个位置。这适用于整数提升之后,因此它不适用于 8 位字节(例如存储在 uint8_t 中),因为这些值首先提升为类型 int ,它至少有 15 个值位。

  • 所以在 C 语言中,将一个字节移动 8 个位置会使其值乘以 256,最终可能会超出类型 int 的范围在具有 16 位整数的体系结构上。

    让我们分析一下这个看起来很无辜的代码:
        uint8_t shift8(uint_8 b) {
    return b << 8;
    }

    因为 b首次晋升为 int ,保值。该值乘以 256,可能超出 int 的范围,导致未定义的行为。在具有 int 的架构上大于 16 位,然后将值隐式转换为返回类型 uint8_t ,它完全定义并评估为模 256 的值,当然是 0。

    所以上面的函数是一致的,并且在许多系统上总是返回 0,但它不是完全一致的,并且在具有 16 位整数的体系结构上具有未定义的行为。

    关于CSAPP : What should happen if I want to shift an 8-bit number 8 positions to the left,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61184263/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com