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。
【图片来自: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 语言 一般使用 1
和 0
或 非0
和 0
表示 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 ,任何声明但没有赋值的局部变量,是不能直接使用的。
在某些情况下,如果没有初始化赋值,系统会自动设置默认值。
例如 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。
C/C++、C#、JAVA(二):基本类型和转换操作的更多相关文章
- Java 中基本类型和字符串之间的转换
Java 中基本类型和字符串之间的转换 在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换. 其中,基本类型转换为字符串有三种方法: 1. 使用包装类的 toString() 方法 2. 使 ...
- Java学习--Java 中基本类型和字符串之间的转换
Java 中基本类型和字符串之间的转换 在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换. 其中,基本类型转换为字符串有三种方法: 1. 使用包装类的 toString() 方法 2. 使 ...
- Java开发学习--Java 中基本类型和包装类之间的转换
Java 中基本类型和包装类之间的转换 基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之 ...
- 【Java】基本类型和引用类型(值传递)
[关键词] [问题] · 加深对基本类型和引用类型的理解: [效果图] [分析] 參见最后的[參考资料] [解决方式] [代码] public void test() throws Exception ...
- Java 基础 - 基本类型和引用类型
ref: https://www.cnblogs.com/ysocean/p/8482979.html#_label2 ------------------ 这里再给大家普及一个概念,在 Java 中 ...
- Java基础——基本类型和包装类、基本类型和字符串之间的转换
基本类型和包装类之间的转换 基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更 ...
- Java基础(35):装箱与拆箱---Java 中基本类型和包装类之间的转换(Wrapper类)
基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更加轻松便利了. 那什么是装箱 ...
- java的基本类型和对应的封装类
封装,是java这门语言的重要核心思想之一,封装也是对面向对象这一思想很好的体现. 在很多情况下,我们需要对数据进行一些转换,如:将一字符串"123"转换成int类型的123,或者 ...
- java中基本类型和包装类型实践经验
至今,小菜用java快两年了,有些事,也该有个总结. 基本类型和包装类型的概念在本文不作赘述. 如果这两种类型直接使用,倒没什么值得讨论的,无非就是自动装箱拆箱,java可以让你感觉不到他们的存在,但 ...
随机推荐
- C++输入带空格的字符串
对于字符数组 1.使用 getline() 读入整行数据,回车键输入的换行符确定输入结尾. 调用方法:cin.getline(str, len) 第一个参数str用来存储输入行的数组名称,第二个参数是 ...
- Python拾遗(2)
包括Python中的常用数据类型. int 在64位平台上,int类型是64位整数: 从堆上按需申请名为PyIntBlcok的缓存区域存储整数对象 使用固定数组缓存[-5, 257]之间的小数字,只需 ...
- 【转载】Scrapy安装及demo测试笔记
Scrapy安装及demo测试笔记 原创 2016年09月01日 16:34:00 标签: scrapy / python Scrapy安装及demo测试笔记 一.环境搭建 1. 安装scrapy ...
- 【转载】[基础知识]【网络编程】TCP/IP
转自http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=27043 [基础知识][网络编程]TCP/IP iooops 胖友们楼主我又 ...
- 两个不错的IT类优质号
虽然标题已经被用烂了,但是我觉得还是用这样的方式介绍这两个不错的公众号,可能你们刚好需要,我刚好知道,仅此而已. 刚认识的一个小哥哥和一个小姐姐,他们都非常优秀,有喜欢Java和Linux的同学千万不 ...
- 码海拾遗:基于MySQL Connector/C++的MySQL操作(连接池)
1.MySQL安装及简单设置 (1)安装:在OSX系统下,可以使用万能的“brew install”命令来进行安装:brew isntall mysql(默认安装最新版的MySQL) (2)启动:br ...
- Android APP性能及专项测试(个人整理)
移动测试. Android测试 .APP测试 Android篇 1. 性能测试 Android性能测试分为两类:1.一类为rom版本(系统)的性能测试2.一类为应用app的性能测试 Android ...
- 【Eclipse】eclipse设置,为了更简单快捷的开发
保存时自动导包 Windows->Perferences->Java->Editor->Save Actions
- cssy元素居中的方法有哪些?
css的元素居中 各位小伙伴们在努力写网页的时候有没有遇到过这样的一个问题呢? 在写的时候发现他不居中,可是要分分钟逼死强迫症的啊! 别急,我来啦 哈哈哈 今天就带来三种css的元素居中的方法 第一种 ...
- [LeetCode] 1103. Distribute Candies to People 分糖果
题目: 思路: 本题一开始的思路就是按照流程一步步分下去,算是暴力方法,在官方题解中有利用等差数列进行计算的 这里只记录一下自己的暴力解题方式 只考虑每次分配的糖果数,分配的糖果数为1,2,3,4,5 ...