🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
📙C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。
在 C 语言中,我们经常需要处理不同进制的数字表示,如二进制、八进制、十进制和十六进制。了解如何在 C 语言中处理这些不同进制的数字对于编写高效和灵活的程序非常重要。
十进制是我们日常生活中最常用的进制,其基数为 10,数字由 0 - 9 组成。在 C 语言中,默认情况下整数常量是十进制的。
例如:
int num_decimal = 123;
在上述代码中,123
就是一个十进制数。
二进制是计算机中最基本的进制,其基数为 2,数字只有 0 和 1 组成。在 C 语言中,要表示二进制数字,需要使用特定的前缀。
以 0b
或 0B
作为前缀来表示二进制数。
例如:
int num_binary = 0b1010; // 相当于十进制的 10
八进制的基数为 8,数字由 0 - 7 组成。在 C 语言中,以数字 0
作为前缀来表示八进制数。
例如:
int num_octal = 012; // 相当于十进制的 10
十六进制的基数为 16,数字由 0 - 9 和 A - F(或 a - f)组成,其中 A - F 表示 10 - 15。在 C 语言中,以 0x
或 0X
作为前缀来表示十六进制数。
例如:
int num_hex = 0xA; // 相当于十进制的 10
我们可以使用除法和取余的方法将十进制数转换为其他进制。以下是将十进制转换为二进制、八进制和十六进制的示例代码:
#include
void decimalToBinary(int decimal) {
int binary[32];
int index = 0;
while (decimal > 0) {
binary[index++] = decimal % 2;
decimal /= 2;
}
for (int i = index - 1; i >= 0; i--) {
printf("%d", binary[i]);
}
printf("\n");
}
void decimalToOctal(int decimal) {
int octal[32];
int index = 0;
while (decimal > 0) {
octal[index++] = decimal % 8;
decimal /= 8;
}
for (int i = index - 1; i >= 0; i--) {
printf("%d", octal[i]);
}
printf("\n");
}
void decimalToHexadecimal(int decimal) {
char hexadecimal[32];
int index = 0;
while (decimal > 0) {
int remainder = decimal % 16;
if (remainder < 10) {
hexadecimal[index++] = remainder + '0';
} else {
hexadecimal[index++] = remainder - 10 + 'A';
}
decimal /= 16;
}
for (int i = index - 1; i >= 0; i--) {
printf("%c", hexadecimal[i]);
}
printf("\n");
}
int main() {
int decimal = 255;
printf("Decimal: %d\n", decimal);
printf("Binary: ");
decimalToBinary(decimal);
printf("Octal: ");
decimalToOctal(decimal);
printf("Hexadecimal: ");
decimalToHexadecimal(decimal);
return 0;
}
在上述代码中,我们分别定义了三个函数 decimalToBinary
、decimalToOctal
和 decimalToHexadecimal
来将十进制数转换为二进制、八进制和十六进制,并在 main
函数中进行调用和输出。
要将其他进制的数转换为十进制,可以使用位权的概念。位权是指一个数字在不同位置上的权重,例如在二进制中,从右往左第 i
位的位权是 2^(i - 1)
;在八进制中,从右往左第 i
位的位权是 8^(i - 1)
;在十六进制中,从右往左第 i
位的位权是 16^(i - 1)
。
以下是将二进制、八进制和十六进制转换为十进制的示例代码:
#include
int binaryToDecimal(int binary) {
int decimal = 0;
int base = 1;
while (binary > 0) {
int remainder = binary % 10;
decimal += remainder * base;
base *= 2;
binary /= 10;
}
return decimal;
}
int octalToDecimal(int octal) {
int decimal = 0;
int base = 1;
while (octal > 0) {
int remainder = octal % 10;
decimal += remainder * base;
base *= 8;
octal /= 10;
}
return decimal;
}
int hexadecimalToDecimal(char *hexadecimal) {
int decimal = 0;
int base = 1;
int length = strlen(hexadecimal);
for (int i = length - 1; i >= 0; i--) {
int digit;
if (hexadecimal[i] >= '0' && hexadecimal[i] <= '9') {
digit = hexadecimal[i] - '0';
} else if (hexadecimal[i] >= 'A' && hexadecimal[i] <= 'F') {
digit = hexadecimal[i] - 'A' + 10;
} else if (hexadecimal[i] >= 'a' && hexadecimal[i] <= 'f') {
digit = hexadecimal[i] - 'a' + 10;
}
decimal += digit * base;
base *= 16;
}
return decimal;
}
int main() {
int binary = 1010;
int octal = 25;
char hexadecimal[] = "1F";
printf("Binary: %d\n", binary);
printf("Decimal: %d\n", binaryToDecimal(binary));
printf("Octal: %d\n", octal);
printf("Decimal: %d\n", octalToDecimal(octal));
printf("Hexadecimal: %s\n", hexadecimal);
printf("Decimal: %d\n", hexadecimalToDecimal(hexadecimal));
return 0;
}
在上述代码中,我们分别定义了三个函数 binaryToDecimal
、octalToDecimal
和 hexadecimalToDecimal
来将二进制、八进制和十六进制转换为十进制,并在 main
函数中进行调用和输出。
printf
函数在 C 语言中,可以使用 printf
函数来输出不同进制的数字。
printf
函数没有直接输出二进制的格式控制符。但我们可以通过位操作和循环来实现。#include
void printBinary(int num) {
for (int i = sizeof(int) * 8 - 1; i >= 0; i--) {
(num & (1 << i))? printf("1") : printf("0");
}
printf("\n");
}
int main() {
int num = 10;
printf("Decimal: %d\n", num);
printf("Binary: ");
printBinary(num);
return 0;
}
%o
格式控制符。#include
int main() {
int num = 10;
printf("Decimal: %d\n", num);
printf("Octal: %o\n", num);
return 0;
}
%x
(小写)或 %X
(大写)格式控制符。#include
int main() {
int num = 10;
printf("Decimal: %d\n", num);
printf("Hexadecimal (lowercase): %x\n", num);
printf("Hexadecimal (uppercase): %X\n", num);
return 0;
}
stdint.h
头文件中的类型和格式控制符C99 引入了
头文件,其中定义了一些整数类型,如 uint8_t
、uint16_t
等,并且提供了相应的格式控制符。
#include
#include
int main() {
uint8_t num = 10;
printf("Decimal: %d\n", num);
printf("Hexadecimal: %" PRIx8 "\n", num);
return 0;
}
其中 PRIx8
是一个宏,用于指定输出 8 位无符号整数的十六进制形式。
位操作在 C 语言中是一种非常强大的工具,而不同进制的表示在位操作中经常会用到。
&
)按位与操作将两个操作数对应的位进行与运算。
例如:
int a = 0b1010; // 10
int b = 0b1100; // 12
int result = a & b; // 0b1000 即 8
|
)按位或操作将两个操作数对应的位进行或运算。
例如:
int a = 0b1010; // 10
int b = 0b1100; // 12
int result = a | b; // 0b1110 即 14
^
)按位异或操作将两个操作数对应的位进行异或运算。
例如:
int a = 0b1010; // 10
int b = 0b1100; // 12
int result = a ^ b; // 0b0110 即 6
<<
)左移操作将操作数的所有位向左移动指定的位数,右边用 0 填充。
例如:
int a = 0b1010; // 10
int result = a << 2; // 0b101000 即 40
>>
)右移操作将操作数的所有位向右移动指定的位数。对于无符号数,左边用 0 填充;对于有符号数,左边用符号位填充。
例如:
int a = 0b1010; // 10
int result = a >> 2; // 0b0010 即 2
在许多系统中,权限通常使用位来表示。例如,一个文件可能具有读、写和执行权限,可以使用不同的位来表示这些权限。
#define READ_PERMISSION 0b001
#define WRITE_PERMISSION 0b010
#define EXECUTE_PERMISSION 0b100
int permissions = READ_PERMISSION | WRITE_PERMISSION; // 具有读和写权限
通过将数据以特定的二进制格式表示,可以实现数据压缩,减少存储空间。
在与硬件设备进行通信时,经常需要处理二进制数据。
许多加密算法涉及到对数据的位操作和不同进制的转换。
了解和掌握 C 语言中不同进制的数字表示以及它们的处理方法对于编写高效、灵活和功能强大的程序是非常重要的。通过合理地运用不同进制和位操作,可以解决许多复杂的问题,并提高程序的性能和效率。
🎉相关推荐