• 计算机程序的思维逻辑 (8)


    看似简单的char

    通过前两节,我们应该对字符和文本的编码和乱码有了一个清晰的认识,但前两节都是与编程语言无关的,我们还是不知道怎么在程序中处理字符和文本。

    本节讨论在Java中进行字符处理的基础 - char,Java中还有Character, String, StringBuffer, StringBuilder等类进行文本处理,他们的基础都是char,我们在后续文章中介绍这些类。

    char看上去是很简单的,正如我们在第2节所说,char用于表示一个字符,这个字符可以是中文字符,也可以是英文字符。赋值时把常量字符用单引号括起来,例如:

    char c = 'A';
    char z = '中';

    但我们在第3节抛出了一个问题,为什么字符类型也可以进行算术运算和比较?char的本质到底是什么呢?

    char的本质

    在 Java内部进行字符处理时,采用的都是Unicode,具体编码格式是UTF-16BE。简单回顾一下,UTF-16使用两个或四个字节表示一个字 符,Unicode编号范围在65536以内的占两个字节,超出范围的占四个字节,BE (Big Endian)就是先输出高位字节,再输出低位字节,这与整数的内存表示是一致的。

    char本质上是一个固定占用两个字节的无符号正整数,这个正整数对应于Unicode编号,用于表示那个Unicode编号对应的字符。

    由于固定占用两个字节,char只能表示Unicode编号在65536以内的字符,而不能表示超出范围的字符。

    那超出范围的字符怎么表示呢?使用两个char。类String有一些相关的方法,后续文章介绍。

    在这个认识的基础上,我们再来看下char的一些行为,就比较容易理解了。

    char的赋值

    char有多种赋值方式:

    1. char c = 'A'
    2. char c = '马'
    3. char c = 39532
    4. char c = 0x9a6c
    5. char c = 'u9a6c'

    第1种赋值方式是最常见的,将一个能用Ascii码表示的字符赋给一个字符变量。

    第 2种也很常见,但这里是个中文字符,需要注意的是,直接写字符常量的时候应该注意文件的编码,比如说,GBK编码的代码文件按UTF-8打开,字符会变成乱码,赋值的时候是按当前的编码解读方式,将这个字符形式对应的Unicode编号值赋给变量,'马'对应的Unicode编号是39532,所以第2种赋值和第3种是一样的。

    第3种是直接将十进制的常量赋给字符,第4种是将16进制常量赋给字符,第5种是按Unicode字符形式。

    以上,2,3,4,5都是一样的,本质都是将Unicode编号39532赋给了字符。

    char的运算

    由于char本质上是一个整数,所以可以进行整数可以进行的一些运算,在进行运算时会被看做int,但由于char占两个字节,运算结果不能直接赋值给char类型,需要进行强制类型转换,这和byte, short参与整数运算是类似的。

    char类型的比较就是其Unicode编号的比较。

    char 的加减运算就是按其Unicode编号进行运算,一般对字符做加减运算没什么意义,但Ascii码字符是有意义的。比如大小写转换,大写A-Z的编号是 65-90,小写a-z的编号是97-122,正好相差32,所以大写转小写只需加32,而小写转大写只需减32。加减运算的另一个应用是加密和解密,将 字符进行某种可逆的数学运算可以做加解密。

    char的位运算可以看做就是对应整数的位运算,只是它是无符号数,也就是说,有符号右移>>和无符号右移>>>的结果是一样的。 

    char的二进制

    既然char本质上是整数,查看char的二进制表示,同样可以用Integer的方法,如下所示:

    char c = '马';
    System.out.println(Integer.toBinaryString(c));

    输出为 1001101001101100

    小结

    本节介绍了char的本质,它固定占用两个字节,实际上是一个整数,表示字符的Unicode编号,不在65536编号内的字符一个char表示不了,需要用两个char。

    我们回顾一下以前所有的章节,整理一下思路。

    我们说,所谓程序,主要就是告诉计算机要对什么数据做什么操作。第1节我们介绍了如何通过变量定义数据,第2节介绍了数据的第一个操作 - 赋值,第3节介绍了数据的基本运算,第4节到本节介绍了数据的二进制表示及位运算。

    至此,我们可以定义基本数据类型,以及对基本数据进行基本运算了,但实际操作中不是只有运算本身的,我们需要有表达类似"如果"/"那么"逻辑的机制,即根据具体情况选择执行的机制,也就是流程控制。

  • 相关阅读:
    Windows SDK编程(Delphi版) 之 应用基础,楔子
    一个小问题引发的论证思考
    Delphi 组件开发教程指南(7)继续模拟动画显示控件
    用PyInstaller将python转成可执行文件exe笔记
    使用 .Net Memory Profiler 诊断 .NET 应用内存泄漏(方法与实践)
    Microsof Office SharePoint 2007 工作流开发环境搭建
    How to monitor Web server performance by using counter logs in System Monitor in IIS
    LINQ之Order By
    window 性能监视器
    内存泄露检测工具
  • 原文地址:https://www.cnblogs.com/zhangkeyu/p/6665951.html
Copyright © 2020-2023  润新知