【C语言基础】数据的进制互换

进制的互相转换

二进制

0 1

八进制

0 1 2 3 4 5 6 7

十进制

0 1 2 3 4 5 6 7 8 9

十六进制

0 1 2 3 4 5 6 7 8 9 A B C D E F

二进制八进制十进制十六进制
0000
1111
10222
11333
100444
101555
110666
111777
10001088
10011199
101010A
101111B
110012C
110113D
111014E
011115F

二进制与十进制的转换

https://jingyan.baidu.com/article/495ba84109665338b30ede98.html

十进制转二进制

方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。

二进制转十进制

方法为:把二进制数按权展开、相加即得十进制数。

二进制与八进制之间的转换

二进制转八进制

方法为:3位二进制数按权展开相加得到1位八进制数。(注意事项,3位二进制转成八进制是从右到左开始转换,不足时补0)。

八进制转成二进制

方法为:八进制数通过除2取余法,得到二进制数,对每个八进制为3个二进制,不足时在最左边补零。

二进制与十六进制之间的转换

二进制转十六进制

方法为:与二进制转八进制方法近似,八进制是取三合一,十六进制是取四合一。(注意事项,4位二进制转成十六进制是从右到左开始转换,不足时补0)。

十六进制转二进制

方法为:十六进制数通过除2取余法,得到二进制数,对每个十六进制为4个二进制,不足时在最左边补零。

十进制与八进制与十六进制之间的转换

十进制转八进制或者十六进制有两种方法

第一:间接法,把十进制转成二进制,然后再由二进制转成八进制或者十六进制。这里不再做图片用法解释。

第二:直接法,把十进制转八进制或者十六进制按照除8或者16取余,直到商为0为止。

八进制或者十六进制转成十进制

方法为:把八进制、十六进制数按权展开、相加即得十进制数。

十六进制与八进制之间的转换

进制与十六进制之间的转换有两种方法

第一种:他们之间的转换可以先转成二进制然后再相互转换。

第二种:他们之间的转换可以先转成十进制然后再相互转换。

原码、反码、补码之间的快速转换和简单运算

原码转换为反码:符号位不变,数值位分别“按位取反”

反码转换为原码也是一样:符号位不变,数值位分别“按位取反”

例:X = -1101001(真值-105)
  X原 = 11101001
  X反 = 10010110

原码转换为补码:符号位不变,数值位按位取反,末位再加1

例:已知X原= 10011010,求X补
    X原= 10011010   原码为负数
         11100101   符号位不变,其余各位取反
        +       1   末位加1
    X补= 11100110

补码转换为原码:符号位不变,数值位按位取反,末位再加1。即补码的补码等于原码

例:已知X补= 11101100,求X原
    X补= 11101100   补码为负数
         10010011   符号位不变,其余各位取反
        +       1   末位加1
    X原= 10010100

求补(变补),即已知[X]补,求[-X]补 。符号位和数值位都取反,末位再加1

[X]补的代码连同符号位一起变反,末位再加1,即得到[-X]补
例:已知[X]= 01010110,求[-X][X]= 01010110   不区分正负号
           10101001   连同符号位一起变反
          +       1   末位加1
   [-X]= 10101010

正整数的原码、反码和补码都一样;

负数部分:

  • 原码和反码的相互转换:符号位不变,数值位按位取反

  • 原码和补码的相互转换:符号位不变,数值位按位取反,末位再加1

  • 已知补码,求原码的负数的补码:符号位和数值位都取反,末位再加1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C语言中,可以使用不同的方法将十进制数转换为十六进制数。以下是三种常见的方法: 方法一:使用循环和条件语句 可以使用循环和条件语句来实现十进制数到十六进制数的转换。具体代码如下所示: ```c #include <stdio.h> int main() { int dec, i = 0; char hex\[200\]; printf("请输入十进制数字:\n"); scanf("%d", &dec); while (dec) { if (dec % 16 >= 10) hex\[i\] = dec % 16 + 55; else hex\[i\] = dec % 16 + 48; i++; dec = dec / 16; } printf("十进制转十六进制的数字是:\n"); for (i = i - 1; i >= 0; i--) printf("%c", hex\[i\]); return 0; } ``` 这段代码首先通过`scanf`函数获取用户输入的十进制数,然后使用循环和条件语句将其转换为十六进制数,并存储在字符数组`hex`中,最后通过循环打印出转换后的十六进制数。 方法二:使用位运算和移位操作 另一种方法是使用位运算和移位操作来实现十进制数到十六进制数的转换。具体代码如下所示: ```c int DectoHex(int dec, unsigned char *hex, int length) { for(int i = length - 1; i >= 0; i--) { hex\[i\] = (dec % 256) & 0xFF; dec /= 256; } return 0; } ``` 这段代码中,`DectoHex`函数接受一个十进制数`dec`,一个指向无符号字符数组的指针`hex`,以及数组的长度`length`。函数通过循环和位运算将十进制数转换为十六进制数,并将结果存储在`hex`数组中。 方法三:使用格式化输出 还可以使用格式化输出来实现十进制数到十六进制数的转换。具体代码如下所示: ```c #include <stdio.h> #define ll long long int int main() { ll a, b; while(scanf("%lld %lld", &a, &b) != EOF) { if(a + b < 0) { printf("-%llX\n", -1 * (a + b)); } else { printf("%llX\n", a + b); } } return 0; } ``` 这段代码中,使用`scanf`函数获取两个十进制数`a`和`b`,然后使用格式化输出将其转换为十六进制数并打印出来。如果结果为负数,则在输出前加上负号。 以上是三种常见的在C语言中将十进制数转换为十六进制数的方法。你可以根据自己的需选择其中一种方法来实现。 #### 引用[.reference_title] - *1* [C语言实现十进制转换为十六进制](https://blog.csdn.net/qq_42680327/article/details/129439898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言:十进制、十六进制数据互换](https://blog.csdn.net/m0_38106923/article/details/120000137)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C语言中十进制转换十六进制(细解)](https://blog.csdn.net/Zhengyangxinn/article/details/107380986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城狮晨哲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值