八进制

6.2.3 八进制数的表达方法

C,C++语言中,如何表达一个八进制数呢?如果这个数是 876,我们可以断定它不是八进制数,因为八进制数中不可能出7以上的阿拉伯数字。但如果这个数是123、是567,或12345670,那么它是八进制数还是10进制数,都有可能。

所以,C,C++规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。这就是八进制数在C、C++中的表达方法。

由于C和C++都没有提供二进制数的表达方法,所以,这里所学的八进制是我们学习的,CtC++语言的数值表达的第二种进制法。

现在,对于同样一个数,比如是100,我们在代码中可以用平常的10进制表达,例如在变量初始化时:

 

int a = 100;

我们也可以这样写:

int a = 0144; //0144是八进制的100;一个10进制数如何转成8进制,我们后面会学到。

 

千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法。

 

6.2.4 八进制数在转义符中的使用

我们学过用一个转义符'/'加上一个特殊字母来表示某个字符的方法,如:'/n'表示换行(line),而'/t'表示Tab字符,'/''则表示单引号。今天我们又学习了一种使用转义符的方法:转义符'/'后面接一个八进制数,用于表示ASCII码等于该值的字符。

比如,查一下第5章中的ASCII码表,我们找到问号字符(?)的ASCII值是63,那么我们可以把它转换为八进值:77,然后用 '/77'来表示'?'。由于是八进制,所以本应写成 '/077',但因为C,C++规定不允许使用斜杠加10进制数来表示字符,所以这里的0可以不写。

事实上我们很少在实际编程中非要用转义符加八进制数来表示一个字符,所以,6.2.4小节的内容,大家仅仅了解就行。

 

6.2.7 十六进制数在转义符中的使用

转义符也可以接一个16进制数来表示一个字符。如在6.2.4小节中说的 '?' 字符,可以有以下表达方式:

 

'?'     //直接输入字符

'/77'   //用八进制,此时可以省略开头的0

'/0x3F' //用十六进制

 

同样,这一小节只用于了解。除了空字符用八进制数 '/0' 表示以外,我们很少用后两种方法表示一个字符。

 

最后一点很重要,C/C++中,10进制数有正负之分,比如12表示正12,而-12表示负12,;但8进制和16进制只能用达无符号的正整数,如果你在代码中里:-078,或者写:-0xF2,C,C++并不把它当成一个负数。

### 在C语言中实现八进制数的加法运算 八进制数在C语言中以`0`开头表示[^2]。为了实现八进制数的加法运算,可以将八进制数转换为十进制数进行计算,然后再将结果转换回八进制形式输出。以下是完整的实现方法: #### 八进制加法的实现逻辑 1. 读取两个八进制数作为输入。 2. 将八进制数转换为十进制数以便进行加法运算。 3. 对转换后的十进制数执行加法运算。 4. 将加法结果从十进制转换为八进制,并输出。 #### 示例代码 以下是一个完整的C语言程序,用于实现八进制数的加法运算: ```c #include <stdio.h> // 将八进制字符串转换为十进制整数 int octalToDecimal(char octal[]) { int decimal = 0, base = 1, len = 0; while (octal[len] != '\0') len++; for (int i = len - 1; i >= 0; i--) { if (octal[i] >= '0' && octal[i] <= '7') { decimal += (octal[i] - '0') * base; base *= 8; } else { printf("非法的八进制数字\n"); return -1; // 返回错误值表示输入不合法 } } return decimal; } // 将十进制数转换为八进制字符串 void decimalToOctal(int decimal, char octal[50]) { int index = 0; if (decimal == 0) { octal[index++] = '0'; } else { while (decimal > 0) { octal[index++] = (decimal % 8) + '0'; decimal /= 8; } } octal[index] = '\0'; // 反转字符串以获得正确的八进制表示 for (int i = 0, j = index - 1; i < j; i++, j--) { char temp = octal[i]; octal[i] = octal[j]; octal[j] = temp; } } int main() { char octal1[50], octal2[50]; printf("请输入第一个八进制数: "); scanf("%s", octal1); printf("请输入第二个八进制数: "); scanf("%s", octal2); // 转换八进制数为十进制数 int decimal1 = octalToDecimal(octal1); int decimal2 = octalToDecimal(octal2); if (decimal1 == -1 || decimal2 == -1) { return 1; // 输入不合法时退出程序 } // 执行加法运算 int sumDecimal = decimal1 + decimal2; // 将结果转换为八进制并输出 char resultOctal[50]; decimalToOctal(sumDecimal, resultOctal); printf("八进制加法结果为: %s\n", resultOctal); return 0; } ``` #### 代码解析 1. **八进制到十进制转换**:通过逐位解析八进制字符串,将其转换为十进制数值。如果输入包含非八进制字符,则返回错误值[^2]。 2. **十进制到八进制转换**:使用模运算和除法操作将十进制数逐步转换为八进制字符串,并通过反转字符串得到正确的八进制表示。 3. **主函数逻辑**:程序首先读取两个八进制数作为输入,然后调用转换函数将它们转换为十进制数进行加法运算,最后将结果转换回八进制形式输出。 #### 示例运行 输入: ``` 请输入第一个八进制数: 015 请输入第二个八进制数: 010 ``` 输出: ``` 八进制加法结果为: 025 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值