当前位置: 首页 > news >正文

【C#学习笔记03】进制转换与反码、补码、原码

1. 进制转换

计算机中的数据通常以二进制形式存储,但在编程和调试过程中,我们经常需要与十进制、八进制和十六进制打交道。因此,掌握进制转换是C语言学习中的重要一环。


1.1 进制的基本概念

  • 二进制(Binary)基数为2,使用数字0和1。
  • 八进制(Octal)基数为8,使用数字0到7。
  • 十进制(Decimal)基数为10,使用数字0到9。
  • 十六进制(Hexadecimal)基数为16,使用数字0到9和字母A到F。

1.2 进制转换方法

1.2.1 二进制转十进制

将二进制数的每一位乘以2的幂次方,然后相加。

将二进制数​​1011​​​转换为十进制:

1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0
= 8 + 0 + 2 + 1
= 11
1.2.2 十进制转二进制

通过不断除以2并记录余数,直到商为0,然后将余数倒序排列。

将十进制数​​11​​​转换为二进制:

11 / 2 = 5 余 1
5 / 2 = 2 余 1
2 / 2 = 1 余 0
1 / 2 = 0 余 1

倒序排列余数:​​1011​​。


1.2.3 二进制转八进制

将二进制数从右到左每三位一组,不足三位补零,然后将每组转换为对应的八进制数。

将二进制数​​101110​​​转换为八进制:

101 110
5   6

结果为​​56​​。


1.2.4 二进制转十六进制

将二进制数从右到左每四位一组,不足四位补零,然后将每组转换为对应的十六进制数。

将二进制数​​101110​​​转换为十六进制:

0010 1110
2    E

结果为​​2E​​。


1.2.5 十进制转十六进制

通过不断除以16并记录余数,直到商为0,然后将余数倒序排列。

将十进制数​​255​​转换为十六进制:

255 / 16 = 15 余 15 (F)
15 / 16 = 0 余 15 (F)

倒序排列余数:​​FF​​。


2. 反码、补码和原码

计算机可以区分整数的正负,但是程序最终都会被转换为二进制指令,二进制可以分正负,在二进制数的前面添加1bit,作为符号位,并且bit=0,用于表示二进制数为正数,bit=1,用于表示二进制数为负数。

可以知道,计算机内部是以二进制的补码方式来存储数据的,所以需要把二进制数的原码转换为补码形式。

可以知道,正数的原码和补码是相同的,所以负数才需要把原码转换为补码,再进行存储!


2.1 原码

原码是二进制数的最基本表示形式,最高位为符号位(0表示正数,1表示负数),其余位表示数值。

  • ​+5​​的原码:​​00000101​
  • ​-5​​的原码:​​10000101​

原码表示法存在以下问题:

  • 0有两种表示形式:​​00000000​​(+0)和​​10000000​​(-0)。
  • 加减法运算复杂,需要额外的硬件支持。

2.2 反码

反码是对原码的改进,正数的反码与原码相同,负数的反码是对其原码的符号位不变,其余位取反。

  • ​+5​​的反码:​​00000101​
  • ​-5​​的反码:​​11111010​

反码表示法仍然存在以下问题:

  • 0有两种表示形式:​​00000000​​(+0)和​​11111111​​(-0)。
  • 加减法运算仍然复杂。

2.3 补码

补码是计算机中表示有符号整数的标准方式。正数的补码与原码相同,负数的补码是其反码加1。

  • ​+5​​的补码:​​00000101​
  • ​-5​​的补码:
  • 原码:​​10000101​
  • 反码:​​11111010​
  • 补码:​​11111011​
  • 0只有一种表示形式:​​00000000​​。
  • 加减法运算统一,可以直接使用加法器实现。

补码的运算
补码的一个重要特性是,一个数的补码的补码等于其原码。因此,补码可以方便地用于表示负数和进行减法运算。

计算​​5 - 3​​:

  • ​5​​的补码:​​00000101​
  • ​-3​​的补码:​​11111101​
  • 相加:​​00000101 + 11111101 = 00000010​​(结果为​​2​​)。

注意设计程序时,定义的变量如果是有符号的,则尽量避免写入超过变量范围的数值!!!!!!

字符型: char  1字节 -- 有符号 -- 数值范围 -128 ~ 127  --  无符号 -- 数值范围 0 ~ 255

短整型:short  2字节 -- 有符号 -- 数值范围 -32768 ~ 32767 无符号 --数值范围 0 ~ 65535


3. C语言中的进制表示与位操作

3.1 进制表示

  • 二进制:C语言不支持直接表示二进制数,但可以通过前缀​​0b​​或​​0B​​表示(某些编译器支持)。
  • 八进制:以​​0​​开头,如​​012​​表示十进制的​​10​​。
  • 十六进制:以​​0x​​或​​0X​​开头,如​​0x1A​​表示十进制的​​26​​。
#include <stdio.h>

int main() {
    int binary = 0b1010;  // 二进制,值为10
    int octal = 012;      // 八进制,值为10
    int hexadecimal = 0x1A;  // 十六进制,值为26
    printf("Binary: %d\n", binary);
    printf("Octal: %d\n", octal);
    printf("Hexadecimal: %d\n", hexadecimal);
    return 0;
}

输出

Binary: 10
Octal: 10
Hexadecimal: 26

3.2 位操作

C语言提供了以下位操作运算符:

  • 按位与(&:对应位都为1时结果为1,否则为0。
  • 按位或(|:对应位有一个为1时结果为1,否则为0。
  • 按位异或(^:对应位不同时结果为1,否则为0。
  • 按位取反(~:将所有位取反。
  • 左移(<<:将二进制数向左移动指定位数,低位补0。
  • 右移(>>:将二进制数向右移动指定位数,高位补符号位(算术右移)或0(逻辑右移)。
#include <stdio.h>

int main() {
    int a = 5;  // 二进制:00000101
    int b = 3;  // 二进制:00000011

    printf("a & b: %d\n", a & b);  // 00000001 (1)
    printf("a | b: %d\n", a | b);  // 00000111 (7)
    printf("a ^ b: %d\n", a ^ b);  // 00000110 (6)
    printf("~a: %d\n", ~a);        // 11111010 (-6,补码表示)
    printf("a << 1: %d\n", a << 1);  // 00001010 (10)
    printf("a >> 1: %d\n", a >> 1);  // 00000010 (2)
    return 0;
}

输出

a & b: 1
a | b: 7
a ^ b: 6
~a: -6
a << 1: 10
a >> 1: 2

相关文章:

  • 数字人源头技术saas厂家开发
  • 木马查杀之AST初识篇
  • UE5.5 Niagara发射器更新属性
  • 迅为RK3568开发板篇Openharmony配置HDF控制UART-实操-HDF驱动配置UART-UART应用开发-UART驱动API接口介绍
  • 四层协议攻防手册:从SYN Flood到UDP反射的深度防御
  • 从前端视角理解消息队列:核心问题与实战指南
  • cesium1.126显示等高线
  • 深度学习基础:线性代数本质2——线性组合、张成的空间与基
  • Linux进程管理15 - CFS调度器2 - 数据结构关系
  • CAMEL 学习笔记一
  • 深入解析 RAG:检索增强生成的原理与应用
  • 【NLP 34、实践 ⑧ 基于faq知识库和文本匹配算法进行意图识别】
  • 如何进行项目风险评估
  • 游戏引擎学习第151天
  • 罗德与施瓦茨SMCV100B,不同技术的多种应用矢量信号发生器
  • AI智能眼镜主控芯片:技术演进与产业生态的深度解析
  • ubuntu20不同版本的cudnn切换
  • golang 静态库 Undefined symbol: __mingw_vfprintf
  • C++蓝桥杯基础篇(十一)
  • 【从零开始学习计算机科学】操作系统(八)IO管理
  • 七部门:进一步增强资本市场对于科技创新企业的支持力度
  • 中国女足将于5月17日至6月2日赴美国集训并参加邀请赛
  • “救护车”半路加价?陕西卫健委已介入,记者调查:黑救护车挤占市场
  • 技术派|更强的带刀侍卫:从054B型战舰谈谈世界护卫舰发展
  • 铁路部门:确保沿线群众安全,焦柳铁路6个区段将陆续安装防护栅栏
  • 《致1999年的自己》:千禧之年的你在哪里?