繁体   English   中英

C如何处理符号扩展?

[英]How does C handle sign extension?

我有一个指向字节缓冲区的指针,我将从中将每个偶数索引字节都复制到一个int(因为该协议将数据存储在缓冲区中,我知道奇数周期可供读取)。 现在当我这样做

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

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

a = (int8_t)buffer[2*i]

数字以签名形式显示。 这迫使我重新考虑c中的符号扩展如何工作,尤其是在上述情况下。 我的理解是,由于我声明为签名,因此编译器将自动进行符号扩展。 任何人都可以花一些时间来解释为什么不是这种情况。 我在这个陷阱中呆了一个小时,不想以后再陷入同一陷阱。

buffer是一个无符号八位整数数组(或充当一个整数)。 因此, buffer[2*i]值在0到255(包括)范围内,并且该范围内的所有值都可以表示为int s,因此分配

a = buffer[2*i];

保留值,通过用零填充来提升为更大的类型int

如果您在分配前int8_tint8_t

a = (int8_t)buffer[2*i]

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

一个int_8仅具有8位,如果最高位为1,则它具有负值:1xxxxxxx,如果将这样的值分配给有符号的int(32位或64位),则当然会得到一个负值。 赋值后,较长的int看起来像11111111 11111111 11111111 1xxxxxxx ,只是一个简单的xor就可以完成技巧00000000 ^ 1001 => 11111001。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM