C语言基本笔记(4)——进制转换与标准输出
进制转换速查表
| 操作 | 方法 | 示例 |
|---|---|---|
| 二进制 → 十进制 | 按权展开求和(2的幂次) | 1011B → 11 |
| 二进制 → 八进制 | 每3位分组,转为八进制数 | 101101B → 55O |
| 二进制 → 十六进制 | 每4位分组,转为十六进制数 | 10110101B → B5H |
| 十进制 → 二进制 | 整数除2取余,小数乘2取整 | 11.625 → 1011.101B |
| 十进制 → 八进制 | 整数除8取余,小数乘8取整 | 51.5 → 63.4O |
| 十六进制 → 二进制 | 每位转为4位二进制 | B5H → 10110101B |
1. 二进制(Binary)
二进制 → 十进制
方法:按权展开求和
示例:1011.101B →
1×2³ + 0×2² + 1×2¹ + 1×2⁰ + 1×2⁻¹ + 0×2⁻² + 1×2⁻³
= 8 + 0 + 2 + 1 + 0.5 + 0 + 0.125 = 11.625
二进制 → 八进制
方法:每3位二进制为一组,不足补0(整数部分左补,小数部分右补)
示例:101101B →
101 101 → 5 5 → 55O
二进制 → 十六进制
方法:每4位二进制为一组,不足补0
示例:10110101B →
1011 0101 → B 5 → B5H
2. 八进制(Octal)
八进制 → 十进制
示例:63.4O →
6×8¹ + 3×8⁰ + 4×8⁻¹ = 48 + 3 + 0.5 = 51.5
八进制 → 二进制
方法:每位八进制转为3位二进制
示例:72O→
7=111, 2=010 → 111 010B → 111010B
八进制 → 十六进制
方法:先转二进制再转十六进制
示例:72O → 111010B → 0011 1010 → 3AH
3. 十进制(Decimal)
十进制 → 二进制
整数:除2取余,逆序排列
小数:乘2取整,顺序排列
示例:11.625 →
整数部分 11 ÷ 2 → 1011B
小数部分 0.625 × 2 → 0.101B
合并结果:1011.101B
十进制 → 八进制/十六进制
方法:整数部分除基取余,小数部分乘基取整
示例(转八进制):51.5 →
整数部分 51 ÷ 8 → 63O
小数部分 0.5 × 8 → 4O
合并结果:63.4O
4. 十六进制(Hexadecimal)
十六进制 → 十进制
示例:A3.FH →
10×16¹ + 3×16⁰ + 15×16⁻¹ = 160 + 3 + 0.9375 = 163.9375
十六进制 → 二进制
方法:每位十六进制转为4位二进制
示例:B5H →
B=1011, 5=0101 → 10110101B
十六进制 → 八进制
方法:先转二进制再转八进制
示例:B5H → 10110101B → 010 110 101 → 265O
注意
-
八进制与十六进制的标识:
- C语言中,八进制以
0开头(如077),十六进制以0x开头(如0xFF)。 - 避免在八进制中使用
8或9(非法字符)。
- C语言中,八进制以
-
二进制输出的实现:
- C语言标准库无直接二进制输出函数,需手动实现位操作。
-
负数的处理:
- 编程语言中负数的进制输出通常以补码形式表示(如
-1的二进制为全1)。
- 编程语言中负数的进制输出通常以补码形式表示(如
C语言标准输出
#include <stdio.h>
int main()
{
int num = 255;
// 十进制输出
printf("十进制: %d\n", num); // 输出 255
// 八进制输出(无前缀)
printf("八进制: %o\n", num); // 输出 377
// 十六进制输出(小写字母)
printf("十六进制: %x\n", num); // 输出 ff
// 十六进制输出(大写字母)
printf("十六进制: %X\n", num); // 输出 FF
// 二进制输出(需手动实现或使用非标准函数)
void print_binary(int n)
{
if (n > 1) print_binary(n >> 1);
printf("%d", n & 1);
}
printf("二进制: ");
print_binary(num); // 输出 11111111
return 0;
}
浙公网安备 33010602011771号