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

简介: 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 字符 '\0'
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。

微信图片_20220503120918.jpg

【图片来自: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。

对于有些地方,\0 也代表了 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 << "\n" << 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 ,任何声明但没有赋值的局部变量,是不能直接使用的。

微信图片_20220503120933.png

微信图片_20220503120937.png


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

例如 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("\n\n");
  printf("%s",b);
  printf("\n\n");
  return 0;
}


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

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

#include <stdio.h>
int main()
{
  int a;
  printf("%d", a);
    printf("\n\n"); 
  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。

相关文章
|
28天前
|
开发框架 Java .NET
C#与Java
在动态且不断发展的软件开发世界中,Java 和 C# 是两个巨头,每个都有自己独特的优势、理念和生态系统。本文深入比较了 Java 和 C#,探讨了它们的历史背景、语言特性、性能指标、跨平台功能等。
C#与Java
WK
|
20天前
|
安全 Java 编译器
C++和Java哪个更好用
C++和Java各具优势,选择取决于项目需求、开发者偏好及目标平台特性。C++性能出色,适合游戏、实时系统等;Java平台独立性强,适合跨平台、安全敏感应用。C++提供硬件访问和灵活编程范式,Java有自动内存管理和丰富库支持。两者各有千秋,需根据具体需求选择。
WK
17 1
|
25天前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
21 5
WK
|
19天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
38 0
WK
|
20天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
35 0
|
1月前
|
缓存 并行计算 Java
C++矢量运算与java矢量运算
本文探讨了C++和Java中的矢量运算与标量运算的性能比较,解释了矢量运算的原理和为什么它比标量运算快,包括并行性、数据局部性、指令优化和数据重用等优势。文章还提供了C++和Java的矢量运算示例代码,并展示了运行结果,以证明矢量运算在处理大量数据时的性能优势。
19 0
C++矢量运算与java矢量运算
|
2月前
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
|
2月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
137 1
|
3月前
|
Rust 安全 Java
Java代码规范--排版,命名.:Rust能否撼动C++的王座?
系统编程是计算机科学的核心,C++长期占据主导地位,但其内存安全问题备受诟病。Rust以安全性为核心,通过所有权和生命周期概念避免了野指针和内存泄漏。此外,Rust的并发模型和日益丰富的生态系统使其成为现代系统编程的新选择,尤其在安全性和并发性方面表现出色。尽管C++依然强大,但Rust为开发者提供了更安全、易管理的选项,未来有望推动更多系统级应用的发展。
26 0
|
4月前
|
存储 Java 索引
Java ArrayList操作指南:如何移除并返回第一个元素
通过上述方法,你可以方便地从Java的 `ArrayList` 中移除并返回第一个元素。这种操作在日常编程中非常常见,是处理列表时的基本技能之一。希望这篇指南能帮助你更好地理解和运用Java的 `ArrayList`。
51 4