gpt4 book ai didi

c - 在 C 中移位位值

转载 作者:太空宇宙 更新时间:2023-11-04 08:35:42 24 4
gpt4 key购买 nike

假设我有以下代码:

uint32_t fillThisNum(int16_t a, int16_t b, int16_t c){

uint32_t x = 0;
uint16_t temp_a = 0, temp_b = 0, temp_c = 0;

temp_a = a << 24;
temp_b = b << 4;
temp_c = c << 4;

x = temp_a|temp_b|temp_c;

return x;
}

本质上,我要做的是用位信息填充 32 位数字,我可以在以后提取这些位信息以执行不同的操作。

参数 a 将保存“数据”的前 24 位,b 将保存接下来的 4 位“数据”和 c将保存“数据”的最后 4 位。

我有几个问题:

  1. 参数的位长是否必须与函数类型相同,并且必须是无符号的?
  2. 我可以将 unsigned int 分配给 signed int 吗? (即 uint32_t a = int32_t b;)
  3. 我能否用 16 位参数填充 32 位数字,只要它们不超过 32 位返回值的长度。

任何建议/提示/提示将不胜感激,谢谢。

最佳答案

编写此代码的正确方法是:

uint32_t fillThisNum(uint32_t a, uint32_t b, uint32_t c)
{
// mask out the bits we are not interested in
a &= 0xFFFFFF; // save lowest 24 bits
b &= 0xF; // save lowest 4 bits
c &= 0xF; // save lowest 4 bits

// arrange a,b,c within a 32-bit unit so that they do not overlap
return (a << 8) + (b << 4) + c;
}

通过为参数使用无符号类型,可以避免任何有符号算术溢出、符号扩展等问题。

调用函数时可以将有符号值作为参数传递,这些值将被转换为无符号值。

通过使用 uint32_t 作为参数类型,您可以避免在进行强制转换时声明任何临时变量或担心类型宽度。通过这种方式,您可以更轻松地编写清晰的代码。

不必这样做,但这是确保您不会犯任何错误的简单方法。

关于c - 在 C 中移位位值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26286244/

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