2012-10-21 45 views
0

我有一个指针指向一个字节缓冲区,我将每个偶数索引字节复制到一个int中(因为数据存储到缓冲区的协议我知道奇数周期用于读取)。 现在,当我做到这一点C如何处理符号扩展?

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

它给了我一个无符号数。但是,当我这样做

a = (int8_t)buffer[2*i] 

该号码以签署的形式呈现。这迫使我重新思考在c工作中如何进行签名扩展,特别是在上述情况下。 我的理解是,自从我声明为有符号时,编译器会自动做符号扩展。任何人都可以花一些时间来解释为什么事实并非如此。我刚刚在这个陷阱里呆了一个小时,不想再次陷入同一陷阱。

+3

好阅读http://www.cs.umd.edu/class/sum2003/cmsc311/Notes /Data/signExt.html –

+0

我知道C中符号扩展是如何工作的,但是在你有一个无符号数的情况下(但是“符号位”是1),并且你通过强制转换为更长的整数来扩展符号,那么如何处理?对不起,如果这不清楚的问题。 – as3rdaccount

回答

2

buffer是一组无符号八位整数(或作为一个整数)。这样的buffer[2*i]值在从0到255(含)的范围内,并且在该范围内的所有值都是可表示为int S,SO分配

a = buffer[2*i]; 

保留值,促进向更广泛类型int是通过填充零来完成。

如果您分配之前转换为int8_t

a = (int8_t)buffer[2*i] 

值在缓冲区大于127转换以实现定义的方式,通过刚刚重新解释位模式为签署键入int8_t,最有可能的8位整数,结果为负值,从-128到-1。这些值可表示为int s,因此它们保留在分配中,然后通过符号扩展完成对更宽类型int的值保留升级。

0

int_8只有8位,如果最高位为1,它将保留一个负值:1xxxxxxx,如果将这样的值分配给带符号整数(32或64位),当然会得到负值。 int越长看起来像11111111 11111111 11111111 1xxxxxxx赋值后,只是一个简单的异或将做的技巧00000000^1001 => 11111001.