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:
specifier | Output | Example |
---|---|---|
d or i | Signed decimal integer | 392 |
u | Unsigned decimal integer | 7235 |
o | Unsigned octal | 610 |
x | Unsigned hexadecimal integer | 7fa |
X | Unsigned hexadecimal integer (uppercase) | 7FA |
f | Decimal floating point, lowercase | 392.65 |
F | Decimal floating point, uppercase | 392.65 |
e | Scientific notation (mantissa/exponent), lowercase | 3.9265e+2 |
E | Scientific notation (mantissa/exponent), uppercase | 3.9265E+2 |
g | Use the shortest representation: %e or %f | 392.65 |
G | Use the shortest representation: %E or %F | 392.65 |
a | Hexadecimal floating point, lowercase | -0xc.90fep-2 |
A | Hexadecimal floating point, uppercase | -0XC.90FEP-2 |
c | Character | a |
s | String of characters | sample |
p | Pointer address | b8000000 |
n | Nothing 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是长整型数据。