博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
char和unsigned char强制转换成int后的差异
阅读量:2042 次
发布时间:2019-04-28

本文共 1746 字,大约阅读时间需要 5 分钟。

转自:

最近有人提到char和unsigned char有什么区别,当然这个问题如果刚学计算机或者编程语言的人来说,非常简单。我也这么认为,无非就是有符号和无符号的差别嘛。

这个问题让我想到了以前学习计算机常识的时候关于补码,原码,反码的差异。这里摘取参考文章【1】中的部分内容:

注意:此处的'=='是相等的意思。'='是赋值的意思。

在机器世界里:

正数的最高位是符号位0,负数的最高位是符号位1。
对于正数:反码==补码==原码。
对于负数:反码==除符号位以外的各位取反。
     补码==反码+1.
     原码==补码-1后的反码==补码的反码+1。(读完本文后,应该能够直观地认识到本式的正确性)
可以轻易发现如下规律:
自然计算 :a-b==c.
计算机计算:a-b==a+b的补码==d.
c的补码是d.
通过此法,可以把减法运算转换为加法运算。
所以补码的设计目的是:
1.使符号位能与有效值部分一起参加运算,从而简化运算规则.
2.减运算转换为加运算,进一步简化计算机中运算器的线路设计.

讲的非常清晰了吧,是的。但是在计算机中,常做类型转换,当char或者unsigned char转换成int的时候,两者的差异是显而易见的。这里采用了部分文章【2】的代码对转换过程做了验证。

1)当我对uch和sch同时赋值-100的时候uch和sch都是十六进制的0x9c

2)此时由于两者一个是有符号,另一个是无符号的,我们可以看到十进制输出的时候,无符号的是156,而有符号的,最前面一个bit解释为了负值 -100

3)然后我们看下对uch进行类型转换(int)然后看下真值,原码,反码和补码

4)最后我们看下对sch进行类型转换(int)然后看下真值,原码,反码和补码

可以看出uch和sch最大的差异就是前面的那个符号位,仅仅那一个bit位,对于我们计算机来说,存储的内容(补码)将是绝然不同的。

真值,原码,反码和补码转换代码请详见参考文章【2】

[cpp] 
  1. /* 检查uchar */  
  2. void CheckUchar(unsigned char uch)  
  3. {  
  4.     int x;  
  5.     char b[MAX+1];   
  6.       
  7.     x = uch;  
  8.     printf("CheckUchar Decimal value:%d\n", x);  
  9.   
  10.     TruthValue(b, x);//获取真值  
  11.     printf("TruthValue:\t%s\n", b);  
  12.   
  13.     TrueForm(b, x); //获取原码  
  14.     printf("TrueForm:\t%s\n", b);  
  15.   
  16.     RadixMinus(b, x);//获取反码   
  17.     printf("RadixMinus:\t%s\n", b);  
  18.   
  19.     Complement(b, x);//获取补码  
  20.     printf("Complement:\t%s\n", b);  
  21. }  
  22.   
  23. /* 检查schar */  
  24. void CheckSchar(char sch)  
  25. {  
  26.     int x;  
  27.     char b[MAX+1];   
  28.   
  29.     x = sch;  
  30.     printf("CheckSchar Decimal value:%d\n", x);  
  31.   
  32.     TruthValue(b, x);//获取真值  
  33.     printf("TruthValue:\t%s\n", b);  
  34.   
  35.     TrueForm(b, x); //获取原码  
  36.     printf("TrueForm:\t%s\n", b);  
  37.   
  38.     RadixMinus(b, x);//获取反码   
  39.     printf("RadixMinus:\t%s\n", b);  
  40.   
  41.     Complement(b, x);//获取补码  
  42.     printf("Complement:\t%s\n", b);  
  43. }  
  44.   
  45. int main()  
  46. {  
  47.     unsigned char uch = -100;  
  48.     char sch = -100;  
  49.     printf("hex: uch = 0x%x, sch = 0x%x\n", uch, sch);  
  50.     printf("dec: uch = %d, sch = %d\n", uch, sch);  
  51.       
  52.     CheckUchar(uch);  
  53.     CheckSchar(sch);  
  54.       
  55.     return 0;  
  56. }  

参考文章:

【1】

【2】

转载地址:http://lmnof.baihongyu.com/

你可能感兴趣的文章
Leetcode C++《热题 Hot 100-36》55.跳跃游戏
查看>>
Leetcode C++《热题 Hot 100-38》56.合并区间
查看>>
Leetcode C++《热题 Hot 100-39》62.不同路径
查看>>
Leetcode C++《热题 Hot 100-40》64.最小路径和
查看>>
Leetcode C++《热题 Hot 100-41》75.颜色分类
查看>>
Leetcode C++《热题 Hot 100-42》78.子集
查看>>
Leetcode C++《热题 Hot 100-43》94.二叉树的中序遍历
查看>>
Leetcode C++ 《第175场周赛-1 》5332.检查整数及其两倍数是否存在
查看>>
Leetcode C++ 《第175场周赛-2 》5333.制造字母异位词的最小步骤数
查看>>
Leetcode C++ 《第175场周赛-3》1348. 推文计数
查看>>
Leetcode C++《热题 Hot 100-44》102.二叉树的层次遍历
查看>>
Leetcode C++《热题 Hot 100-45》338.比特位计数
查看>>
读书摘要系列之《kubernetes权威指南·第四版》第一章:kubernetes入门
查看>>
Leetcode C++《热题 Hot 100-46》739.每日温度
查看>>
Leetcode C++《热题 Hot 100-47》236.二叉树的最近公共祖先
查看>>
Leetcode C++《热题 Hot 100-48》406.根据身高重建队列
查看>>
《kubernetes权威指南·第四版》第二章:kubernetes安装配置指南
查看>>
Leetcode C++《热题 Hot 100-49》399.除法求值
查看>>
Leetcode C++《热题 Hot 100-51》152. 乘积最大子序列
查看>>
Leetcode C++《热题 Hot 100-50》98.验证二叉搜索数
查看>>