gpt4 book ai didi

仅通过类型转换就可以完成符号/零扩展吗?

转载 作者:太空狗 更新时间:2023-10-29 15:40:47 27 4
gpt4 key购买 nike

我有一个家庭作业问题(MIPS 模拟器),例如,它要求我们采用 16 位“立即数”值并将其符号和/或零扩展到 32 位。我的印象是这可以通过强制转换轻松完成,例如:

uint32_t imm = (uint16_t)IMM_FIELD(instruction); # Zero extend to 32-bits

uint32_t imm = (int16_t)IMM_FIELD(instruction); # Sign extend to 32-bits

但后来我在网上看到一段代码,其中有人在同一个项目上写了他们自己的“sign_extension8to16”、“sign_extension16to32”函数,这些函数通过将 8 位数字右移 7 来工作,并评估是否或不是最高有效位(现在位于一个位置)为 1,然后返回一个转换为 (uint16_t) 的数字,该数字相应地将高 8 位掩码为 0 或 1。

这样的方法真的有必要吗?我认为 Actor 肯定已经解决了这个问题。我问的原因是我有非常奇怪的错误消息,我无法查明问题所在,所以我认为原因可能是我错误地为零并符号扩展...

最佳答案

IMO:你的方法会奏效。

让我们简化问题。

推广uint16_tuint32_t和推广int16_tint32_t很容易理解并且出现了预期的结果。零填充无符号整数并符号扩展有符号整数。

int main() {
uint16_t u = 65535;
int16_t i = -1;
printf("%" PRIu32 "\n", (uint32_t) u);
printf("%" PRId32 "\n", (int32_t) i);
return 0;
}

65535
-1

推广int16_tuint32_t将首先推广int16_tint32_t然后到 uint32_t . (实际上我认为它首先提升到 int16_tint 再到 int32_t 然后到 uint32_t 如果 sizeof int <= sizeof int32_t 。)因此代码在使结果成为无符号整数之前进行符号扩展。

推广uint16_tint32_t将促进uint16_t直接到int32_t .一个简单的零扩展。

注意:当我应该说“转换”时,我可能会使用“提升”。

int main() {
uint16_t u = 65535;
int16_t i = -1;
printf("%" PRIu32 "\n", (uint32_t) i);
printf("%" PRId32 "\n", (int32_t) u);
return 0;
}

4294967295
65535

关于仅通过类型转换就可以完成符号/零扩展吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23176386/

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