如何将负十进制数转换为带符号的八进制/十六进制数。
这是我的代码及其输出的一部分:
#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
让我们以下面的例子为例,以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;
}
"%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));