在C语言中移位位值

在C语言中移位位值,c,bit,unsigned,bit-shift,C,Bit,Unsigned,Bit Shift,假设我有以下代码: 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|tem

假设我有以下代码:

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;
}
uint32\u t fillThisNum(int16\u t a、int16\u t b、int16\u t c){
uint32_t x=0;
uint16温度a=0,温度b=0,温度c=0;
温度a=a
  • 参数是否必须与函数类型的位长度相同,并且必须是无符号的
  • 否,参数和返回值可以是不同的类型

  • 我可以将无符号整数分配给有符号整数吗?(即uint32\u t a=int32\u t b;)
  • 是的,该值将从有符号值转换为无符号值。“b”中的位将保持不变,因此当“b”在2的补码中时,“a”将是一个32位的正数

    例如,让int8_t c=-127。如果执行赋值uint8_t d=c,那么“d”将是129

  • 我可以用16位参数填充32位数字,只要它们不超过32位返回值的长度
  • 如果这样说,您的意思是您在代码中所采用的方式:

    x = temp_a|temp_b|temp_c;
    

    是的,这很好,@chux提到了一个警告:您不能将一个n位值移到n位以上。如果您想在x中设置比15位更重要的位,一种方法是将一个临时掩码设置为32位值而不是16位值。

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

    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\u t fillThisNum(uint32\u t a、uint32\u t b、uint32\u t c)
    {
    //掩盖我们不感兴趣的部分
    a&=0xFFFFFF;//保存最低24位
    b&=0xF;//保存最低4位
    c&=0xF;//保存最低4位
    //在32位单元内排列a、b、c,使它们不会重叠
    
    return(注意:如果
    int
    位大小为16,
    temp_a=a通常更好地使用无符号类型与有符号类型进行移位。当您说“参数是否必须与函数类型具有相同的位长度…”时,请使用“函数类型”,你的意思是函数返回值的类型吗?@plafratt是的,如果返回类型是uint32\u t,那么参数是否也必须是uint32\u t类型。你能描述一下32位结果的哪些位应该来自何处吗?你的实际代码只填充(最多)
    x
    的低16位,因为所有
    temp
    s都是16位,并且它与
    c
    重叠
    b
    。代码
    int8\u t c=0x81;
    可以给
    c
    任何值或发出信号(必须由编译器文档描述)。这是实现定义的行为。这很有趣。这是基于C规范的吗?如果是,请提供一个参考?我可以改为说uint8_t C=-127吗?是的,C99 6.3.1.3/3。
    uint8_t C=-127;
    定义良好,并且包含在6.3.1.3/2中。好的,谢谢。我不知道。我想编译器也是这样做的在所有情况下,对两种文字都使用了ing。我希望了解一下标准。在C11中,它是相同的编号和文本。请注意,
    0x81
    是一种类型为
    int
    和value
    129
    的文字。非常好但简单的解释。Matt需要一个正确方向的线索,这很有帮助。我可以将此逻辑应用到更复杂的领域现在是x问题,谢谢!正如我在回答中提到的,如果需要发送16位参数,可以这样做,然后将它们移动到32位临时值,以在返回值中设置适当的位。