c/c++语言开发共享C如何处理符号扩展?

我有一个指向字节缓冲区的指针,我将每个偶数索引字节复制到一个int(因为数据存储到缓冲区的协议我知道奇数循环用于读取)。 现在当我这样做

signed int a; ... //inside a loop a = buffer[2*i]; //buffer is unsigned 

它给了我一个未签名的号码。 但是,当我这样做

 a = (int8_t)buffer[2*i] 

号码以签名forms呈现。 这迫使我重新思考c中的符号扩展如何工作,特别是在上面的场景中。 我的理解是,因为我声明一个已签名的编译器将自动执行符号扩展。 任何人都可以花点时间解释为什么不是这种情况。 我只是花了一个小时在这个陷阱中,并且不希望将来再陷入同样的​​陷阱。

    buffer是一个无符号的8位整数数组(或作为一个整数)。 所以buffer[2*i]值在0到255(含)范围内,该范围内的所有值都可以表示为int s,因此赋值

     a = buffer[2*i]; 

    保留该值,通过用零填充来完成对更宽类型int的提升。

    如果在分配之前转换为int8_t

     a = (int8_t)buffer[2*i] 

    大于127的缓冲区中的值以实现定义的方式转换为int8_t类型,最有可能的方法是将位模式重新解释为带符号的8位整数,从而产生负值,从-128到-1。 这些值可以表示为int ,因此它们在赋值中保留,然后通过符号扩展完成对更宽类型int的保值提升。

    int_8只有8位,如果最高位为1则保持负值:1xxxxxxx,如果将这样的值赋给signed int(32或64位),当然你会得到一个负值。 更长的int看起来像11111111 11111111 11111111 1xxxxxxx分配后,只需要一个简单的xor就可以做到00000000 ^ 1001 => 11111001。

      以上就是c/c++开发分享C如何处理符号扩展?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/522156.html

      (0)
      上一篇 2020年12月9日
      下一篇 2020年12月9日

      精彩推荐