我正在一个项目中,我需要获取一系列带符号的16位整数,负值和正值,并将其发送给函数以在单元测试期间进行分析。

由于不同的原因,该函数仅采用无符号16位整数数组,因此我需要将有符号整数存储在无符号16位整数数组中并完全保留相同的位模式。我正在使用gcc(Debian 8.3.0-6)8.3.0。

unsigned short arr[450];
unsigned short arrIndex = 0;

for (short i = -32768; i < (32767 - 100) ; i = i + 100 )
{
    arr[arrIndex] = i;

    printf("short value is          : %d\n", i);
    printf("unsigned short value is : %d\n", arr[arrIndex]);
    arrIndex++;
}

即使是我告诉printf打印带符号的值,我也惊讶地发现对于那些小于零的值,位模式实际上是不同的。前几个值如下:
short value is           : -32768
unsigned short value is  : 32768

short value is           : -32668
unsigned short value is  : 32868

short value is           : -32568
unsigned short value is  : 32968

这里发生了什么,我将如何保留i的值小于零的位模式?

最佳答案



对于非常常见的2补码编码,以下内容就足够了。

unsigned short us = (unsigned short) some_signed_short;

BITD日具有补码和符号幅度,这还不够,并且代码将使用unionshortunsigned short

然而,由于如何将负值2的补码转换为无符号,因此对于相同大小的类型保留了位模式。



位模式相同。他们经过不同的转换路径进行打印,因此文本输出也不同。

打印short, unsigned short时,最好使用h printf修饰符。
//printf("short value is          : %d\n", i);
//printf("unsigned short value is : %d\n", arr[arrIndex]);
printf("short value is          : %hd\n", i);
printf("unsigned short value is : %hu\n", arr[arrIndex]);

10-06 06:02