零、先问个问题:数据类型是个啥?

打个比方:你要往一个杯子里装东西,杯子有很多种——水杯(装水)、酒杯(装酒)、汤碗(装汤)。数据类型就是「装数据的杯子」,你得先告诉电脑你要用哪种杯子,它才知道怎么帮你装、怎么帮你用。

C# 自带了一堆「杯子」,每种能装的东西不一样大、不一样精确。我们这一篇先把表格里那 11 种类型一个一个过一遍。

本次目标只有一句话:看到一种类型,能说出来——它叫什么、能装多大、是整数还是小数、经常用在哪


一、整型家族:byte 和 sbyte(最小的一对兄弟)

表格里第一对是 ByteSByte,它们的区别就一个字母 S:S 代表 Signed(有符号),没有 S 代表 Unsigned(无符号)

类型 名字 范围 占用空间
sbyte 有符号字节 -128 到 127 1 字节
byte 无符号字节 0 到 255 1 字节
怎么理解「有符号 / 无符号」?

想象成一块路牌:

  • 无符号(byte)只能往前数:从 0 开始,数到 255。
  • 有符号(sbyte)有个 0 路口,左边是负数(-128 ~ -1),右边是正数(1 ~ 127),0 自己站路口。

所以同样是「1 个字节(8 位)」,byte 能装 0 ~ 255,sbyte 把一半空间让给了负数,就只能装 -128 ~ 127。

能跑起来的小例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;

class Program
{
static void Main()
{
// 装两个字节,一个有符号一个没符号
sbyte temperature = -10; // 温度可以是负的
byte valveOpen = 200; // 阀门开度 0~255,没负数

Console.WriteLine("温度:" + temperature);
Console.WriteLine("阀开度:" + valveOpen);
}
}

在 Visual Studio 里按 Ctrl + F5 跑一下,看到黑窗口里打出「温度:-10」「阀开度:200」就对了。

上位机里啥时候用?
  • Modbus RTU 里读取单个寄存器的「字节」,经常先落到 byte
  • 串口报文里每一帧的字节,也用 byte 数组装。
  • 温度、压力这种可以负的量,会用 sbyte 或更「胖」的类型(往下看)。

二、再胖一点:short 和 ushort

byte / sbyte 是一模一样的关系,就是「杯子」变成了 2 字节大小。

类型 名字 范围 占用空间
short 有符号短整型 -32768 到 32767 2 字节
ushort 无符号短整型 0 到 65535 2 字节

例子

1
2
3
4
5
short  errorCode = -5000;     // 错误码可以是负数
ushort deviceId = 60000; // 设备编号从 0 起算

Console.WriteLine(errorCode);
Console.WriteLine(deviceId);
上位机里啥时候用?

有些老 PLC(比如西门子 S7-200)单个模拟量通道就是 16 位(2 字节)整数,读上来用 short 接刚刚好。


三、最常用的主力:int 和 uint

重点来了,绝大多数情况下你写代码用的整数就是 int

类型 名字 范围 占用空间
int 有符号整型 -2147483648 到 2147483647(约 ±21 亿) 4 字节
uint 无符号整型 0 到 4294967295(约 42 亿) 4 字节

例子

1
2
3
4
5
int  productCount = 12345;     // 今天生产了 12345 个
uint totalPower = 4000000000; // 累计用电量,不会为负

Console.WriteLine(productCount);
Console.WriteLine(totalPower);

注意原表里 Int 写的是「-2E31 ~ 2E31-1」,那是科学计数法的简写,意思就是 -2^31 ~ 2^31-1(差不多 ±21 亿)。后面 Long、UInt 也是同样的写法。

上位机里为啥这么常用?
  • Modbus TCP 读保持寄存器,返回的就是 16 位整数,乘个系数后再放进 int
  • 计件数、扫码枪的物料编号、生产班次号……基本上都是 int
  • 如果确认不会为负,用 uint 表达更清楚(别人一看就知道「这玩意儿不会小于 0」)。

四、最大块的:long 和 ulong

long 是「加大版整数」,能装非常大的数。

类型 名字 范围 占用空间
long 有符号长整型 -9223372036854775808 到 9223372036854775807 8 字节
ulong 无符号长整型 0 到 18446744073709551615 8 字节

例子

1
2
3
4
5
6
// 时间戳——从 1970-01-01 到现在的毫秒数,这个值非常大,得用 long
long timestamp = 1735872000123L;
ulong fileSize = 5000000000UL; // 文件 5G 字节大小

Console.WriteLine(timestamp);
Console.WriteLine(fileSize);

看代码里数字后面那个 L / UL 没?没加的话,C# 默认按 int / uint 处理,数字一大就报错。加个 L 就是告诉电脑:「这哥们其实是 long / ulong,别搞错了」。

上位机里啥时候用?
  • 时间戳:从 PLC 上来的「开机总时间」、服务器下发的「UTC 时间戳」都是 long
  • 累计流量:工厂一年的水流量、电量,用 int 可能装不下,必须 long
  • 序列号 / 流水号:超过 21 亿的千万别用 int,会绕回负数。

五、带小数点的「浮点型」:float

整数只能装 1、2、3 这种干干净净的数,带小数的就得用浮点型了。

类型 范围(大约) 占用空间 精度
float ±3.4 × 10^38 4 字节 大约 6~7 位有效数字
double ±1.79 × 10^308 8 字节 大约 15~16 位有效数字

第一个浮点类型:float

1
2
3
4
5
6
// 注意:float 必须带 F 后缀,不然默认是 double,编译会出错
float temperature = 36.5F; // 体温
float voltage = 3.3F; // 电压 3.3V

Console.WriteLine(temperature);
Console.WriteLine(voltage);

float 一定要在数字后面加 F 或 f,比如 36.5F。这是 C# 的规矩,不加 F 它就以为你是 double,往 float 里塞 double 会报错。


六、常用主力浮点:double

类型 范围(大约) 占用空间 精度
double ±1.79 × 10^308 8 字节 大约 15~16 位有效数字

例子

1
2
3
4
5
6
// double 是「默认」的小数类型,数字后面什么后缀都不用加
double pressure = 101.325; // 大气压
double ratio = 0.6180339887;// 黄金分割比

Console.WriteLine(pressure);
Console.WriteLine(ratio);
float 和 double 怎么选?

简单记:

场景用啥
内存敏感(比如要存几万个点的缓存)float 够了
普通模拟量换算、计算结果double,更精确
财务金额、计费别用这两个!decimal(本次没列在表里,先记下)
上位机里常见的换算

很多 PLC 的模拟量原始值是 0~27648(西门子 S7-200 SMART 习惯),要换算成工程量:

1
2
3
4
5
// 假设:0 对应 0°C,27648 对应 100°C
double rawValue = 13824; // PLC 读上来的原始值
double realValue = rawValue / 27648.0 * 100.0;

Console.WriteLine("实际温度:" + realValue + "°C");

可以看到除数和倍数都用了小数点(27648.0 而不是 27648),这样保证结果也是小数。


七、不是数字:对和错——bool

「布尔类型」就两个值:真(true)假(false),不用纠结范围。

类型 取值 占用空间
bool truefalse 1 字节

例子

1
2
3
4
5
bool isRunning  = true;    // 设备正在运行
bool isAlarm = false; // 当前没有报警

Console.WriteLine(isRunning);
Console.WriteLine(isAlarm);
上位机里啥时候用?
  • 心跳信号:设备是不是还活着?
  • 报警标志:温度超标了没有?
  • 阀门状态:开/关。
  • 通信结果:读寄存器成功了吗?

基本上所有「是不是 / 有没有 / 成功了没」的问题,答案都是 bool


八、文本家族:char 和 string

char 是单个字符,string 是一串字符。

类型 含义 例子
char 单个字符,用单引号 'A''你''1'
string 一串字符,用双引号 "Hello""设备1号"

例子

1
2
3
4
5
6
7
char   letter  = 'A';
string device = "温度传感器-01号";
string report = "当前温度:36.5 度,运行正常。";

Console.WriteLine(letter);
Console.WriteLine(device);
Console.WriteLine(report);

注意看引号:**char 用单引号'A'),string 用双引号**("A")。写错引号会编译报错。

上位机里啥时候用?
  • 设备名称、点位编号:"PT-101"(压力变送器 101)。
  • 通信报文:Modbus、串口协议返回的字节,经常需要先转成 string 才看得懂。
  • 报警消息:拼接 "温度超限!" + 当前值 + "度" 直接显示到界面上。

九、整张表小结

下面把表格重新整理一次,方便以后查:

类型 名字 范围 / 取值 默认值 占字节
bool 布尔 true / false false 1
sbyte 有符号字节 -128 到 127 0 1
byte 无符号字节 0 到 255 0 1
short 有符号短整型 -32768 到 32767 0 2
ushort 无符号短整型 0 到 65535 0 2
int 有符号整型 约 ±21 亿 0 4
uint 无符号整型 0 到 约 42 亿 0 4
long 有符号长整型 约 ±9.2 × 10^18 0 8
ulong 无符号长整型 0 到 约 1.8 × 10^19 0 8
float 单精度浮点 约 ±3.4 × 10^38(6~7 位精度) 0.0F 4
double 双精度浮点 约 ±1.79 × 10^308(15~16 位) 0.0 8
char 单字符 U+0000 到 U+FFFF '\0' 2
string 字符串 一串字符 null -

十、选择速查表(重点记忆)

记不住没问题,用的时候回来翻这张表就行。

场景 推荐类型
不知道用啥 默认 **int**(整数)或 **double**(小数)
计件、编号、不会为负 uintulong
时间戳、超大累计值 long
串口 / Modbus 单个字节 byte
温度、压力这类物理量 double(精度好)
内存吃紧、上万个点要存 float
金额、计费 decimal(本次没列,先记下)
是 / 否 / 开 / 关 bool
文本、点位名 string

看完表格,记住 int / double / bool / string 这四个是最常用的主力

看完表格,知道 byte/sbyte/short/ushort 是整型家族一员,只是大小不同

看完表格,知道 float 必须加 F 后缀,double 不用加


十一、一个能跑的小练习

把下面的代码复制进你的 Visual Studio,跑一下看看结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;

class Program
{
static void Main()
{
// 1) 上报时间戳
long ts = 1735872000123L;
Console.WriteLine("时间戳:" + ts);

// 2) 温度(带小数)
double temp = 25.6;
Console.WriteLine("温度:" + temp + " °C");

// 3) 设备是否在线
bool online = true;
Console.WriteLine("设备在线:" + online);

// 4) 设备名
string name = "PT-101";
Console.WriteLine("设备名:" + name);

// 5) 累计脉冲数(不会为负)
uint pulse = 123456;
Console.WriteLine("累计脉冲:" + pulse);

// 6) 模拟量原始值(整数)
int raw = 13824;
double real = raw / 27648.0 * 100.0;
Console.WriteLine("原始值:" + raw + " → 实际:" + real + " °C");
}
}
点我对照一下输出对不对
1
2
3
4
5
6
时间戳:1735872000123
温度:25.6 °C
设备在线:True
设备名:PT-101
累计脉冲:123456
原始值:13824 → 实际:50 °C

能看到 设备在线:True,而不是 true,是因为 C# 把 bool 默认打印成首字母大写的形式,这是 .NET 的约定。


十二、小结

这一篇我们学了 12 种 C# 常用基础类型

  • 整型家族(byte / sbyte / short / ushort / int / uint / long / ulong):装整数,越往后越大。
  • 浮点家族(float / double):装带小数点的数,double 更常用、更精确。
  • bool:装真 / 假。
  • char / string:装字符和文本。

记一个简单口诀:

有 S 能负数,没 S 全正数;小数看 F 字母,文本看双引号。

下一步建议:

  1. 在 Visual Studio 里把上面那段代码改一改——比如把 double 改成 float,看会报什么错。
  2. 试着把表里每一种类型都用一遍,每个类型随便赋值、打印一次。
  3. 接下来我们会学变量——怎么给数据起名字,怎么改值。

本笔记对应截图中的 11 种类型(Bool、SByte、Byte、Short、UShort、Int、UInt、Float、Long、ULong、Double、String),并补上了表格里没单独列出的 char,方便后续学文本时使用。