C语言整数类型及printf格式化输出问题总结复习及进制转换的简单实现

C语言允许使用八进制整数与十六进制整数,八进制整数加前导0(数字),十六进制整数加前导0X。

int a = 100;

也可以这样写:
int a = 0144; //  4+8*4+1*8*8=100


用八进制表达时,不能少了最前的那个0。否则计算机会通通当成10进制。


C,C++规定,16进制数必须以 0x开头。比如 0x1表示一个16进制数。而1则表示一个十进制。其中x不区分大小写。(注意:0x中的0是数字0,而不是字母O)

/**********************************************
程序运行结果如下:
i=0256
十进制数174 <======>对应八进制为00000000256
十进制数174 <======>对应十六进制为000000ae
d-- 174
o-- 256
x-- ae
i=256
d-- 256
o-- 400
x-- 100
十进制数598 <======>对应八进制为00000001126
十进制数598 <======>对应十六进制为00000256
i=0x256
d-- 598
o-- 1126
x-- 256
i=0400
十进制数256 <======>对应八进制为00000000400
十进制数256 <======>对应十六进制为00000100
d-- 256
o-- 400
x-- 100
十进制数512 <======>对应八进制为00000001000
十进制数-512 <======>对应八进制为37777777000
十进制数512 <======>对应二进制为00000000000000000000001000000000
十进制数-512 <======>对应二进制为11111111111111111111111000000000
十进制数5 <======>对应二进制为00000000000000000000000000000101
十进制数-5 <======>对应二进制为11111111111111111111111111111011


***********************************************/


#include<cstdio>
#include<cstdio>
#include<cstring>
#include<cmath>
void dec_to_bin(int x)
{
     char *table="01";
     char array[33];
     int num;
     num = x;
     array[32] = '\0';
     int i = 31;
     if (x > 0)
     {
          memset(array,'0',32);
          while(x)
          {
               array[i--] = table[x % 2];
               x>>=1;
          }
     }
     if (x < 0)
     {
          memset(array,'1',32);
          int j;
          for(j=0; j<32; j++)
          {
               array[i--] = table[x & 0x01];
               x >>= 1;
          }
     }
     printf("十进制数%d <======>对应二进制为%s\n", num, array);
}
void dec_to_oct(int x)
{
     char *table = "01234567";
     char array[12]; //数组设定为12.是因为除了结束符之外,考虑到负数的输入,
                 //其转化为补码再转为八进制数出,32位每三个取组成一个8进制数。因此元素为11个。
     int num;
     num = x;
     array[11] = '\0';
     int i = 10;
     if (x > 0)
     {
          memset(array,'0',11);
          while(x)
          {
               array[i--] = table[x % 8];
               x >>=3;
          }
      }
     if (x < 0)
     {
          memset(array,'1',11);
          int j;
          for(j=0; j<10; j++)// 32/3 = 10;
          {
               array[i--] = table[x & 0x07];
               x >>= 3;
           }
          array[i] = table[x & 0x03];
     }
     printf("十进制数%d <======>对应八进制为%s\n", num, array);
}
void dec_to_hex(int x)
{
     char *table = "0123456789abcdef";
     char array[9];
     array[8] = '\0';
     int i = 7, num;
     num = x;
     if (x > 0)
     {
          memset(array,'0',8);
          while(x)
         {
              array[i--] = table[x % 16];
              x = x / 16 ;
         }
     }
     else
     {
          memset(array,'1',8);
          int j;
          for(j=0; j<8; j++)
          {
               array[i--] = table[x & 0x0f];
               x >>= 4;
           }
     }
     printf("十进制数%d <======>对应十六进制为%s\n", num, array);
}
int main()
{

    int i=0256;
    /*八进制256 十进制为6+5*8+2*8*8=174*/

    printf("i=0256  \n");
    dec_to_oct(174);
    dec_to_hex(174);
    printf("d-- %d\n",i);
    printf("o-- %o\n",i);
    printf("x-- %x\n",i);

    i=256;
    printf("i=256  \n");

    printf("d-- %d\n",i);
    printf("o-- %o\n",i);
    printf("x-- %x\n",i);

    i=0x256;
    /*十六进制256 十进制为6+5*16+2*16*16=598*/
    dec_to_oct(598);
    dec_to_hex(598);
    printf("i=0x256  \n");

    printf("d-- %d\n",i);
    printf("o-- %o\n",i);
    printf("x-- %x\n",i);

    i=0400;
    /*八进制256 十进制为4*8*8=256*/
    printf("i=0400  \n");
    dec_to_oct(256);
    dec_to_hex(256);

    printf("d-- %d\n",i);
    printf("o-- %o\n",i);
    printf("x-- %x\n",i);


    dec_to_oct(512);
    dec_to_oct(-512);

    dec_to_bin(512);
    dec_to_bin(-512);

    dec_to_bin(5);
    dec_to_bin(-5);
    /*************
    5的二进制表示为0000 .... 0000 0101 原码反码补码一样
    -5在计算机中以补码形式存在,为5的原码取反加一
    0000 .... 0000 0101  取反 1111 .... 1111 1010 加一为 1111 .... 1111 1011
    **************/

    return 0;
}
/**********************************************
程序运行结果如下:
i=0256
十进制数174 <======>对应八进制为00000000256
十进制数174 <======>对应十六进制为000000ae
d-- 174
o-- 256
x-- ae
i=256
d-- 256
o-- 400
x-- 100
十进制数598 <======>对应八进制为00000001126
十进制数598 <======>对应十六进制为00000256
i=0x256
d-- 598
o-- 1126
x-- 256
i=0400
十进制数256 <======>对应八进制为00000000400
十进制数256 <======>对应十六进制为00000100
d-- 256
o-- 400
x-- 100
十进制数512 <======>对应八进制为00000001000
十进制数-512 <======>对应八进制为37777777000
十进制数512 <======>对应二进制为00000000000000000000001000000000
十进制数-512 <======>对应二进制为11111111111111111111111000000000
十进制数5 <======>对应二进制为00000000000000000000000000000101
十进制数-5 <======>对应二进制为11111111111111111111111111111011

Process returned 0 (0x0)   execution time : 0.030 s
Press any key to continue.

***********************************************/



A format specifier follows this prototype: 
%[flags][width][.precision][length]specifier

Where the specifier character at the end is the most significant component, since it defines the type and the interpretation of its corresponding argument:

specifierOutputExample
d or iSigned decimal integer392
uUnsigned decimal integer7235
oUnsigned octal610
xUnsigned hexadecimal integer7fa
XUnsigned hexadecimal integer (uppercase)7FA
fDecimal floating point, lowercase392.65
FDecimal floating point, uppercase392.65
eScientific notation (mantissa/exponent), lowercase3.9265e+2
EScientific notation (mantissa/exponent), uppercase3.9265E+2
gUse the shortest representation: %e or %f392.65
GUse the shortest representation: %E or %F392.65
aHexadecimal floating point, lowercase-0xc.90fep-2
AHexadecimal floating point, uppercase-0XC.90FEP-2
cCharactera
sString of characterssample
pPointer addressb8000000
nNothing printed.
The corresponding argument must be a pointer to a signed int.
The number of characters written so far is stored in the pointed location.
 
%A % followed by another % character will write a single % to the stream.%


%c    一个字符 
%d    有符号十进制整数 
%e    浮点数、e-记数法
%E    浮点数、E-记数法
%f    浮点数、十进制记数法  
%g    根据数值不同自动选择%f或%e.
%G    根据数值不同自动选择%f或%e.
%i               有符号十进制数(与%d相同)
%o    无符号八进制整数
%p    指针    
%s    字符串
%u    无符号十进制整数
%x    使用十六进制数字0f的无符号十六进制整数 
%X    使用十六进制数字0f的无符号十六进制整数
%%    打印一个百分号


格式说明形式如下:%【flags】【width】【.prec】【F|N|h|l】【type】

 各部分说明如下:

(1)“【】”表示该项为可选项,即可有可无,如printf(“%d”,100);

(2)flags为可选择的标志字符,常用标志有:

 ------- 左对齐输出,默认为右对齐输出;

+------正数输出加号,负数输出减号;

空格----- 正数输出空格代替加号,负数输出减号。

(3)width为可选择的宽度指示符。

 用十进制正数表示设置输出值的最少字符个数。不足则补空格,多出则按实际输出,默认按实际输出,例如:

printf(”%8d\n”,100);

printf(“%6d\n”,100);

printf(“%-8d\n”,100);

printf(“%+8d\n”,100);

输出结果为:

_____100//_表示空格,以下类同,不再说明。

___100

100______

____+100

(4)【.prec】为可选的精度指示符。

用“小数点”加“十进制正整数”表示,对“整数”、“实数”和“字符串”的输出有如下功能:对“整数”,表示至少要输出的字数个数,不足不数字0,多则原样输出;对“实数”,表示小数点后至多输出的数字个数,不足则补数字0,多则做舍入处理;对“字符串”,表示最多输出的字符个数,不足补空格,多则丢弃。

(5)【F|N|h|l】为可选的输出长度修饰符,其功能如下:

F――输出远指针存放的地址;

N――输出近指针存放的地址;

h――输出短整型数据的值;

l――输出长整型或双精度型数据的值;

例如:

long n=40000;
printf(“%8ld”,n);//因为200×200是长整型数据。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值