C語言中的常見進(jìn)制轉(zhuǎn)換詳解(從二進(jìn)制到十六進(jìn)制)
1、進(jìn)制基礎(chǔ)
在數(shù)學(xué)和計(jì)算機(jī)科學(xué)中,進(jìn)制(又稱為數(shù)制)是用來表示數(shù)字的系統(tǒng)。常見的進(jìn)制有:
- 二進(jìn)制:基數(shù)是 2,常用符號(hào)是
0和1,在計(jì)算機(jī)內(nèi)部廣泛應(yīng)用。 - 八進(jìn)制:基數(shù)是 8,常用符號(hào)是
0-7,在早期計(jì)算機(jī)編程中使用較多。 - 十進(jìn)制:基數(shù)是 10,常用符號(hào)是
0-9,我們?nèi)粘I钪惺褂玫倪M(jìn)制。 - 十六進(jìn)制:基數(shù)是 16,常用符號(hào)是
0-9和A-F,廣泛用于表示計(jì)算機(jī)中的內(nèi)存地址和其他低級(jí)別操作。
我們將在以下內(nèi)容中,探討如何在這些進(jìn)制之間進(jìn)行轉(zhuǎn)換。
2、C語言中的進(jìn)制轉(zhuǎn)換
2.1 從十進(jìn)制轉(zhuǎn)換為其他進(jìn)制
在C語言中,常常需要將十進(jìn)制數(shù)字轉(zhuǎn)換為其他進(jìn)制的表示。可以使用格式化輸出功能來輕松實(shí)現(xiàn)。
十進(jìn)制轉(zhuǎn)二進(jìn)制
C語言標(biāo)準(zhǔn)庫沒有直接提供將十進(jìn)制轉(zhuǎn)換為二進(jìn)制的函數(shù),但我們可以通過循環(huán)和位運(yùn)算來實(shí)現(xiàn)這一功能。
#include <stdio.h>
void decimalToBinary(int n) {
if (n > 1) {
decimalToBinary(n / 2); // 遞歸處理高位
}
printf("%d", n % 2); // 輸出當(dāng)前位的二進(jìn)制
}
int main() {
int num = 29;
printf("Decimal %d in Binary: ", num);
decimalToBinary(num);
printf("\n");
return 0;
}
輸出:
Decimal 29 in Binary: 11101
- 解析:
decimalToBinary函數(shù)通過遞歸將十進(jìn)制數(shù)不斷除以2,直到商為0,再從最低位到最高位輸出結(jié)果。
十進(jìn)制轉(zhuǎn)八進(jìn)制
C語言中,使用 %o 格式控制符可以直接輸出八進(jìn)制表示。
#include <stdio.h>
int main() {
int num = 29;
printf("Decimal %d in Octal: %o\n", num, num); // %o 輸出八進(jìn)制
return 0;
}
輸出:
Decimal 29 in Octal: 35
- 解析:這里,
%o用來打印數(shù)字的八進(jìn)制表示。
十進(jìn)制轉(zhuǎn)十六進(jìn)制
同理,C語言提供了 %X 或 %x 控制符來輸出十六進(jìn)制數(shù)。
#include <stdio.h>
int main() {
int num = 29;
printf("Decimal %d in Hexadecimal: %X\n", num, num); // %X 輸出大寫十六進(jìn)制
return 0;
}
輸出:
Decimal 29 in Hexadecimal: 1D
- 解析:
%X打印十六進(jìn)制數(shù),并使用大寫字母(A-F)。
2.2 從其他進(jìn)制轉(zhuǎn)換為十進(jìn)制
C語言標(biāo)準(zhǔn)庫提供了方便的函數(shù)來將字符串形式的數(shù)字轉(zhuǎn)換為十進(jìn)制整數(shù),例如 strtol 或 strtoul。這使得從其他進(jìn)制(如二進(jìn)制、八進(jìn)制、十六進(jìn)制)轉(zhuǎn)換為十進(jìn)制變得非常簡(jiǎn)單。
二進(jìn)制轉(zhuǎn)十進(jìn)制
由于沒有直接的標(biāo)準(zhǔn)函數(shù)將二進(jìn)制字符串轉(zhuǎn)為十進(jìn)制,我們可以使用 strtol 函數(shù)來進(jìn)行二進(jìn)制字符串到十進(jìn)制的轉(zhuǎn)換。
#include <stdio.h>
#include <stdlib.h>
int main() {
const char* binary = "11101"; // 二進(jìn)制字符串
int num = strtol(binary, NULL, 2); // 2 表示二進(jìn)制
printf("Binary %s in Decimal: %d\n", binary, num);
return 0;
}
輸出:
Binary 11101 in Decimal: 29
- 解析:
strtol將給定的二進(jìn)制字符串"11101"轉(zhuǎn)換為十進(jìn)制整數(shù)29,參數(shù)2表示輸入的字符串是二進(jìn)制。
八進(jìn)制轉(zhuǎn)十進(jìn)制
類似地,我們可以使用 strtol 將八進(jìn)制字符串轉(zhuǎn)換為十進(jìn)制:
#include <stdio.h>
#include <stdlib.h>
int main() {
const char* octal = "35"; // 八進(jìn)制字符串
int num = strtol(octal, NULL, 8); // 8 表示八進(jìn)制
printf("Octal %s in Decimal: %d\n", octal, num);
return 0;
}
輸出:
Octal 35 in Decimal: 29
十六進(jìn)制轉(zhuǎn)十進(jìn)制
同樣,十六進(jìn)制字符串也可以通過 strtol 函數(shù)轉(zhuǎn)換為十進(jìn)制:
#include <stdio.h>
#include <stdlib.h>
int main() {
const char* hex = "1D"; // 十六進(jìn)制字符串
int num = strtol(hex, NULL, 16); // 16 表示十六進(jìn)制
printf("Hexadecimal %s in Decimal: %d\n", hex, num);
return 0;
}
輸出:
Hexadecimal 1D in Decimal: 29
- 解析:這里,
strtol將十六進(jìn)制字符串"1D"轉(zhuǎn)換為十進(jìn)制整數(shù)29,參數(shù)16表示輸入的字符串是十六進(jìn)制。
3、進(jìn)制轉(zhuǎn)換的實(shí)用場(chǎng)景
進(jìn)制轉(zhuǎn)換在許多應(yīng)用中都有實(shí)際用途,特別是在涉及到計(jì)算機(jī)系統(tǒng)底層操作時(shí)。以下是一些常見的應(yīng)用場(chǎng)景:
- 內(nèi)存地址和指針:在調(diào)試程序時(shí),內(nèi)存地址通常使用十六進(jìn)制表示,進(jìn)制轉(zhuǎn)換幫助理解地址的分布。
- 文件與數(shù)據(jù)流:在網(wǎng)絡(luò)編程和二進(jìn)制文件處理中,經(jīng)常需要在不同進(jìn)制之間進(jìn)行轉(zhuǎn)換,尤其是處理網(wǎng)絡(luò)協(xié)議中的字節(jié)流時(shí)。
- 硬件編程:嵌入式系統(tǒng)和硬件編程中,常常需要用二進(jìn)制或十六進(jìn)制表示設(shè)備的狀態(tài)、控制寄存器等。
4、總結(jié)
C語言中,進(jìn)制轉(zhuǎn)換是一個(gè)非常實(shí)用的技能。通過內(nèi)建的格式化輸出(如 %o、%x)和字符串轉(zhuǎn)換函數(shù)(如 strtol),我們可以方便地在二進(jìn)制、八進(jìn)制、十進(jìn)制和十六進(jìn)制之間進(jìn)行轉(zhuǎn)換。
今天我們學(xué)習(xí)了:
- 如何將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制、八進(jìn)制和十六進(jìn)制。
- 如何將二進(jìn)制、八進(jìn)制、十六進(jìn)制字符串轉(zhuǎn)換為十進(jìn)制數(shù)。
- 進(jìn)制轉(zhuǎn)換在計(jì)算機(jī)編程中的實(shí)際應(yīng)用。
到此這篇關(guān)于C語言中的進(jìn)制轉(zhuǎn)換詳解(從二進(jìn)制到十六進(jìn)制)的文章就介紹到這了,更多相關(guān)C語言進(jìn)制轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++寬字符與普通字符的轉(zhuǎn)換實(shí)例詳解
這篇文章主要介紹了C++寬字符與普通字符的轉(zhuǎn)換實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06
使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作
這篇文章給大家介紹了使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作,文中通過圖文結(jié)合的方式介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-12-12
C語言編程中分配內(nèi)存空間的相關(guān)函數(shù)
這篇文章主要介紹了C語言編程中分配內(nèi)存空間的相關(guān)函數(shù),分別是malloc()函數(shù)和calloc()函數(shù),需要的朋友可以參考下2015-08-08
C/C++ 中實(shí)現(xiàn)讓控制臺(tái)暫停的方法
這篇文章主要介紹了C/C++ 中實(shí)現(xiàn)讓控制臺(tái)暫停的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
嵌入式項(xiàng)目使用C語言結(jié)構(gòu)體位段特性實(shí)現(xiàn)斷言宏校驗(yàn)數(shù)據(jù)范圍有效性的方法
今天小編就為大家分享一篇關(guān)于嵌入式項(xiàng)目使用C語言結(jié)構(gòu)體位段特性實(shí)現(xiàn)斷言宏校驗(yàn)數(shù)據(jù)范圍有效性的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
C語言實(shí)現(xiàn)一個(gè)多線程委托模型的示例詳解
這篇文章主要介紹了C語言實(shí)現(xiàn)一個(gè)多線程委托模型,這就是一個(gè)使用C語言實(shí)現(xiàn)多線程委托模型的例子,其中包含boss線程和worker線程,可以處理工作線程的異常情況,需要的朋友可以參考下2023-06-06

