负整数/浮点十进制数到标准C代码中的有符号十六进制和八进制

问题描述 投票:1回答:2

如何将负十进制数转换为带符号的八进制/十六进制数。

这是我的代码及其输出的一部分:

#include <stdio.h>
#include <float.h>
#include <limits.h>


int main()
{

signed short int sui1 = -127;

printf("+------------+-----+-----+------------+------------+------------+");
printf("------------+------------+\n");
printf("%s %11s %6s %5s %12s" , "Type", "Var", "Size", "Dec.", "Hex."  );
printf("%13s %10s %14s", "Oct.", "FP", "Exp\n");


printf("%s %10s %4i %6i %#14x" , "char", "c1", sizeof(c1), c1, c1); 
printf("%#13o %10f %22e\n", c1, c1, c1);

return 0;
}

我的八进制和十六进制的输出没有像我希望的负数,有什么建议吗?

小数= -128

八进制= 0177601

十六进制= 0xff81

c hex decimal signed octal
2个回答
1
投票

让我们以下面的例子为例,以8位的二进制数来说明事情:

11111111

如果它被认为是有符号数,那么十进制值将为-1

11111111
||||||||---> +1*2^0
|||||||----> +1*2^1
||||||-----> +1*2^2
|||||------> +1*2^3
||||-------> +1*2^4
|||--------> +1*2^5
||---------> +1*2^6
|----------> -1*2^7
             -------
               -1

因为最左边的位将被视为符号位并被视为负数,但其余(前7位)将保持为正,当获得基数10中的值时,如上所示

如果它是无符号位,则所有位都为正,以获得基数10中的值为255

11111111
||||||||---> +1*2^0
|||||||----> +1*2^1
||||||-----> +1*2^2
|||||------> +1*2^3
||||-------> +1*2^4
|||--------> +1*2^5
||---------> +1*2^6
|----------> +1*2^7
             -------
               255

正如您所看到的那样二进制数11111111在二进制表示法中对于有符号和无符号,(即使是八进制表示法(0377)和十六进制表示法(0xFF))也是相同的,但十进制表示法有所不同,这取决于您认为它是否为签名号码或无符号号码

这是一个将带符号的十进制转换为十六进制和八进制表示法的程序

#include <stdio.h>

int main()
{
    int nb;
    printf("please enter the decimal number: ");
    scanf("%d",&nb);
    char octal[100]="",hex[100]="";
    //octal will hold the octal notation 
    //hex will hold the hexadecimal notation
    sprintf(octal,"%#o",nb); //convert decimal to octal 
    sprintf(hex,"%#X",nb); // convert decimal to hexadecimal 

    // show the result 
    printf("converting %d to hexadecimal notation %s\n",nb,hex);
    printf("converting %d to octal notation %s\n",nb,octal);

    return 0;
}

0
投票

"%o""%x"格式说明符期望unsigned匹配参数。因此,即使代码传递带负值的signed short int,该值也会在打印前最终转换为unsigned。因此,仅打印正值(和0)。

要在base-16(或使用"%o"的base-8)中打印负数,代码可以使用;

signed short int sui1 = -127;
printf("%c%x", sui1 < 0 ? '-' : '+', (unsigned) abs(sui1));
© www.soinside.com 2019 - 2024. All rights reserved.