C语言中二进制八进制十六进制怎么用?新手必看

张开发
2026/4/15 23:40:49 15 分钟阅读

分享文章

C语言中二进制八进制十六进制怎么用?新手必看
在C语言里主要关注的是字符、整型、浮点型这些数据类型对于赋值语句的另一个知识点也就是进制计数法关注度不高作为开发者可能了解过其中十进制和十六进制在嵌入式里应用还算广泛然而二进制和八进制就不行了所以在这里统一整理下进行说明。进制计数法格式进制计数法格式说明C语言程序里对于声明进制支持采用“前缀 数字”这种格式所支持的进制有二进制有八进制有十进制还有十六进制具体格式如下所示。// 二进制, 以0b开头的对象 0b // 八进制 0 // 十进制 // 十六进制 0x // 举例说明 int a1 0b1001; // 对应数字9 int a2 011; // 对应数字9 int a3 9; int a4 0xF; // 对应数字15 int a5 0xF1; // 对应数字15*161241可以看到不同进制的格式说明如下。在这里存在着一个容易出错的要点此要点在于那些以0开头进行声明的数字尽管它们全部都是由数字所构成然而却属于八进制要是将其理解成十进制那么其数据便有可能出现错误的情况就如同下面所呈现的这段代码。#include int main(int argc, char *argv[]) { int a1 7; int a2 07; int a3 17; int a4 017; printf(a1 %d\n, a1); // a1 7 printf(a2 %d\n, a2); // a2 7 printf(a3 %d\n, a3); // a3 17 printf(a4 %d\n, a4); // a4 15 return 0; }对于上述代码具体执行结果如下所示。能够看到在没有出现进位的状况下添加0后输出依旧是一致的然而一旦有进位产生添加0就会使得值变得不一样了八进制的进位情形与十进制是不相同的。不过八进制在C语言里开发使用的频率是很低的所以在留意声明数字时除了0之外其他时候都不要以0作为开头就行要是存在特殊场景需求自然而然就会去加以关注反倒风险是比较低的。进制计数法运用假设进制计数法不会对数据的存储机制以及输出造成影响那么其好处主要是显示更为清晰在一些特殊场景当中二和十六进制的显示相较于十进制显得更加清晰这便于用户去进行分析。对于这些不同的数制而言主要是被用于地址定义、赋值以及打印显示此处展示常用的场景。地址定义和赋值使用进制计数法可以方便查看具体示例如下所示。// flash起始动作 #define FLASH_ADDRESS 0x08000000 // #define FLASH_ADDRESS 134217728 // SDRAM起始地址 #define SDRAM_ADDRESS 0xC0000000 // 赋值寄存器数据 TIM-CR 0x03000001; // 位操作 int b 0b0101; b ~b;能够看到就FLASH_ADDRESS而言两种定义在结果层面是一致的然而采用十六进制能够一下子看出确切的地址使得书写出现问题的概率得以降低下面这种写法哪怕少了几百、几千也察觉不到赋值以及位操作亦是如此这种写法能够一下子看出结果让手写出问题的概率降低。打印显示printf格式化方面支持数值依照不同格式打印其中有%d、%o、%x以及%X还支持不同进制输出。具体示例如下所示。#include int main(int argc, char* argv[]) { int a1 42; printf(a1 %d\n, a1); // a1 42 printf(a1 0%o\n, a1); // a1 052 printf(a1 0x%x\n, a1); // a1 0x2a printf(a1 0x%X\n, a1); // a1 0x2A return 0; }对于上述代码具体执行结果如下所示。有望见到能够指定相同的数值于不同样式的进位记数制作之下呈现展示只不过不一样样式的进位记数制作的起始标记需要自身去补充完整。数字后缀字符于C语言里头亦有着对在数字之后添加上后缀字符予以支持的情况此之举旨在用来表明不一样的后缀具体所呈现出来的后缀字符像下面所展示的这样。后缀字符含义u/U无符号整数(unsigned)l/L对于位于整数之后的情况其作用是用来表示长整数也就是long而在浮点数之后的那种情况所起到的作用是表示长双精度浮点数这便是long double。ll长长整数(long long)f/F单精度浮点数(f)ul/UL无符号长整数(unsigned long)这里存在着一个知识点当在声明数字之际要是没有去添加后缀字符那么默认情况下会依据数字的范围以及精度自行挑选合适的后缀字符除此之外还存在着另一个颇为特别的知识点那便是对于浮点数而言要是没有添加后缀字符默认会被视作双精度浮点数(double)在这种时候当赋值给单精度浮点数(float)时有可能会致使精度丢失。对于数字后缀具体示例如下所示。#include int main(int argc, char* argv[]) { int a1 42; unsigned int a2 231u; float f1 3.14f; double d1 3.1415926; long double d2 32424.55; printf(a1 %d\n, a1); printf(a2 %u\n, a2); printf(f1 %f\n, f1); printf(d1 %lf\n, d1); printf(d2 %Lf\n, d2); return 0; }对于上述代码具体执行结果如下所示。存在这样一个格式化方面的知识点对于单精度浮点数而言其输出所使用的是%f 而双精度浮点数输出运用的是%lf 至于长双精度浮点数输出采用的则是%Lf。

更多文章