• C/C++、C#、JAVA(二):基本类型和转换操作


    基本类型和转换操作

    数据类型

    C语言中的基本类型如下。

    类型 存储大小 值范围
    char 1 字节 -128 到 127 或 0 到 255
    unsigned char 1 字节 0 到 255
    signed char 1 字节 -128 到 127
    int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
    unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
    short 2 字节 -32,768 到 32,767
    unsigned short 2 字节 0 到 65,535
    long 4 字节 -2,147,483,648 到 2,147,483,647
    long long long int 8 -9223372036854775808~+9223372036854775807
    unsigned long 4 字节 0 到 4,294,967,295
    float 4 字节 1.2E-38 到 3.4E+38
    double 8 字节 2.3E-308 到 1.7E+308
    long double 16 字节 3.4E-4932 到 1.1E+4932

    C# 和 java 基本数据类型如下

    C#类型 java类型 描述 默认值
    bool boolean 布尔值 False
    byte byte 8 位无符号整数 0
    char char 16 位 Unicode 字符 ''
    decimal BigDecimal(非基本) 128 位精确的十进制值,28-29 有效位数 0.0M
    double double 64 位双精度浮点型 0.0D
    float float 32 位单精度浮点型 0.0F
    int int 32 位有符号整数类型 0
    long long 64 位有符号整数类型 0L
    sbyte 8 位有符号整数类型 0
    short short 16 位有符号整数类型 0
    uint 32 位无符号整数类型 0
    ulong 64 位无符号整数类型 0
    ushort 16 位无符号整数类型 0

    C语言中, char 为 一字节,使用 ASCII 编码,C# 和 Java 中,字符类型(char)都是 2字节,使用 Unicode 编码。

    C# 和 Java 中 ,无论是 32 位 机器还是 64 位机器, int 都是 4 字节,long 8字节。

    数据类型使用示例

    C/C++

    c语言的基本类型使用示例如下。

    	short a = 1;	// short int a = 1;
    	int b = 1;
    	long c = 1L;	// long类型,数字需要带 L
    	long long d = 1LL;	// 两个ll
    
    	char e = '1';
    
    	float f = 1.0;
    	double g = 1.0F;	// 使用F
    

    C语言 默认整形类型为 int,浮点数类型为 float。

    因此赋值常量的时候,如果不是默认的类型,则需要在数值后加上 L 或 F。

    short 不需要加;double 加的是 F。

    img

    【图片来自:biancheng.net】

    C语言中,不同进制的表示方法:

    • 默认为10进制 ,如10 ,20,直接赋值即可。
    • 8进制,开头加上0,如012,013。
    • 二进制,开头加上0b,如0b11。
    • 16进制,开头加上0x,大小写不分,0x21458adf。

    注意的是,只有整型才能有这些进制表示法,浮点型不行的。

    C#、JAVA

    C# 和 JAVA 中使用上面同样示例,如下

                short a = 1;
                int b = 6_666_666;
                long c = 1L;    // long类型,数字需要带 L
    
                char e = '1';
    
                float f = 1.0F;
                double g = 1.0;
    
                byte h = 1;
    

    C# 和 JAVA 中默认整型是 int,浮点型是 double。

    因此 float 要带 F。

    C# 和 JAVA 中使用的进制表示法,跟 C 语言一致。

    另外,C# 和 JAVA 中,可以使用下划线来分隔数字,提高可读性。例如

                int b = 6_666_666;
                int b = 0b00000000_00000000_00000000_00000001;
    

    关于布尔型

    C 语言中,没有布尔型。

    C++ 为 bool,C# 为 bool,java 为 boolean。

    C语言中没有 bool 类型,但是很多地方都需要 true 和 flase,怎么解决呢?
    C 语言 一般使用 10非00 表示 true 和 flase。

    对于有些地方, 也代表了 false。

    例如

    int a = 6666;
    int b = 161616;
    printf("%s",a & b?"true":"flase");
    

    a&b 的结果是一个数字,只要大于 0 或 小于 0 ,即为 true。
    而且 C# / Java 中,?: 运算符,左侧条件必须是 bool ,不能为数字。

    基本类型的操作

    操作方法从哪里来

    高级语言提供了大量优秀的库代码,通过调用这些代码,我们可以实现许多骚操作,减少工作量。

    首先我们来看一下 C# 和 java 的一部分代码

    // C#
                int a = new int();
                a = 666;
    
                Int32 b = new Int32();
                b = new int();
                b = 666;
    
    // JAVA
            int a = 666;
    
            Integer b = new Integer(666);
    

    在 C# 中,每个预定义类型(基本数据类型)都是系统提供的类型的简写。

    例如,关键字int指的是 struct System.Int32

    也就是说, C# 中,int , System.Int32 是等同的。

    而在 JAVA 中,int 是基本数据类型,Integer 则是一个包装了 int 的类型,为 int 类型提供了丰富的操作方法。

    因此,在 JAVA 中,int a = new int() 的使用是错误的。

    C# 中的 int 类型,带有一些方法,但是不多。

    JAVA 的 Integer 类提供了一些比较丰富的操作方法。

    例如转换字符串为数字,C# 主要靠 Convert 进行转化,JAVA 通过 Integer 就可以操作。

    在 C 语言中,基本类型的操作方法,来源于库函数。

    字符串转为数值

    C

    需要注意的是,C语言中没有字符串类型(string)。

    C语言中, stdlib.h 头文件定义了几个基本类型以及一些函数。

    我们可以将字符串这样转为 int 类型

    	char a[] = "123";
    	int b = atoi(a);
    

    从互联网中,我抄录了一些常用的转换函数:

    ● atof():将字符串转换为双精度浮点型值。

    ● atoi():将字符串转换为整型值。

    ● atol():将字符串转换为长整型值。

    ● strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。

    ● strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字。

    ● strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。

    ● itoa():将整型值转换为字符串。

    ● ltoa():将长整型值转换为字符串。

    ● ultoa():将无符号长整型值转换为字符串。

    ● gcvt():将浮点型数转换为字符串,取四舍五入。

    ● ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。

    ● fcvt():指定位数为转换精度,其余同ecvt()。

    C++

    C++ 引入 #include <iostream>后,就可以直接使用上面 C语言 的函数。

    C++可以使用 #include <string> 这个库;C++ 中, string 类型在 string 这个库中定义。

    #include <sstream> 这里,可以更加方便地字符串和数值转换。例如

    #include<iostream>  
    #include <sstream>   
    #include <string>
    using namespace std;
    int main()
    {
        //字符转数字
        string str1 = "2018219";
        string str2 = "2018.219";//浮点数转换后的有效数为6位
        int num1 = 0;
        double num2 = 0.0;
        stringstream s;
        //转换为int类型
        s << str1;
        s >> num1;
        //转换为double类型
        s.clear();
        s << str2;
        s >> num2;
        cout << num1 << "
    " << num2 << endl;
        return 0;
    }
    // 示例来源 https://www.jianshu.com/p/5c6a6fdb1a41
    

    另外还可以通过 sprintf()sscanf()函数来实现字符串与数值的转换。

    C#

    C# 转换字符串为数值,非常简单

                string a = "123";
    
                int b = int.Parse(a);           // int 也包含一些常用方法
                int c = Convert.ToInt32(a);     // 静态类 Convert 中,还有很多的转换方法和重载方法
    

    Convert 有各种基本类型相互转换的方法。

    JAVA

    JAVA 中,可以这样转换

            String a = "123";
            int b = Integer.valueOf(a);   // 通过静态方法
    
            Integer c = new Integer(a); // 将 Interger 类转为 int
            b = c.intValue();
    

    可以看出,JAVA 中,基本数据类型没啥方法,就是单纯表示数值。

    C# 中除了 类型本身带有的方法外,通过 Convert 中丰富的丰富,实现类型转换;

    JAVA 中,要使用相应数据类型的对象进行操作,例如 int 是 Integer,double 是 Double。

            String a = "123.123";
            double b = Double.valueOf(a);
    

    默认值和初始化

    C# 和 JAVA

    C# 和 JAVA ,任何声明但没有赋值的局部变量,是不能直接使用的。


    在某些情况下,如果没有初始化赋值,系统会自动设置默认值。

    例如 C# 和 JAVA 中

            static void Main(string[] args)
            {
                Test(b);
                Console.ReadKey();
            }
    
            public static int b;
            public static void Test(int a)
            {
                Console.WriteLine(a);
                Console.WriteLine(b);
            }
    
        public static void main(String[] args) {
            Test(b);
        }
    
        public static int b;
    
        public static void Test(int a) {
            System.out.println(a);
            System.out.println(b);
        }
    

    输出结果都是 0。

    C# 中这些情况下会自动初始化设置默认值

    • 静态变量。
    • 类实例的实例变量。
    • 数组元素。

    JAVA 的默认值情况 跟 C# 一样。

    另外,C# 有个 default 关键字,可以自动赋予默认值。

    int a = default(int);
    // 或
    int a = default;
    

    在一些暂时不需要赋值或碰到编译器不让通过时,设置常量默认值可能会导致歧义,使用 default 特别方便。

    C语言

    我们先写个例子来运行一下

    #include <stdio.h>
    int a;
    char b[5];
    int main()
    {
    	printf("%d",a);
    	printf("
    
    ");
    	printf("%s",b);
    	printf("
    
    ");
    	return 0;
    }
    

    如无意外,会出现 a 为0,b 为空白。

    我们改一下代码,重写运行

    #include <stdio.h>
    
    int main()
    {
    	int a;
    	printf("%d", a);
    
        printf("
    
    "); 
    	char b[5];
    	printf("%s", b);
    	return 0;
    }
    

    上面的代码在 c-free 等编译器可以编译通过,在 Vsual Studio 不能(原因是变量a)。

    如果强行通过的话,运行后会出现

    3567616
    
    亐wP@
    

    修改一下,变成下面的代码,在 Vsual Studio 中运行,会出现 烫烫烫烫烫烫烫烫烫烫烫烫烫烫...

    #include <stdio.h>
    
    int main(){
    	char b[5];
    	printf("%s", b);
    	return 0;
    }
    

    以上示例可以看出,C 语言也是有默认值的,静态变量会出现默认值。

    字符数组,声明时,系统会分配内存,并且为每个字节的设置值。

    而 char 表示范围最大只有256。

  • 相关阅读:
    memset功能的具体说明
    理解离散傅立叶变换(一. 傅立叶的起源变换)
    OutputCache说明
    二进制搜索
    UEditor用法
    —页面布局实例———win7自己的小算盘
    HDU 1698 Just a Hook (段树更新间隔)
    JDBC batch批量Statement executeBatch 详细解释
    Android ListView快速定位(三)
    Android ListView快速定位(二)
  • 原文地址:https://www.cnblogs.com/whuanle/p/12547151.html
Copyright © 2020-2023  润新知