CSharp数据类型的认识
零、先问个问题:数据类型是个啥?
C# 自带了一堆「杯子」,每种能装的东西不一样大、不一样精确。我们这一篇先把表格里那 11 种类型一个一个过一遍。
本次目标只有一句话:看到一种类型,能说出来——它叫什么、能装多大、是整数还是小数、经常用在哪。
一、整型家族:byte 和 sbyte(最小的一对兄弟)
表格里第一对是 Byte 和 SByte,它们的区别就一个字母 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 | using System; |
在 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 | short errorCode = -5000; // 错误码可以是负数 |
上位机里啥时候用?
有些老 PLC(比如西门子 S7-200)单个模拟量通道就是 16 位(2 字节)整数,读上来用 short 接刚刚好。
三、最常用的主力:int 和 uint
重点来了,绝大多数情况下你写代码用的整数就是 int。
| 类型 | 名字 | 范围 | 占用空间 |
|---|---|---|---|
int |
有符号整型 | -2147483648 到 2147483647(约 ±21 亿) | 4 字节 |
uint |
无符号整型 | 0 到 4294967295(约 42 亿) | 4 字节 |
例子
1 | int productCount = 12345; // 今天生产了 12345 个 |
注意原表里 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 | // 时间戳——从 1970-01-01 到现在的毫秒数,这个值非常大,得用 long |
看代码里数字后面那个 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 | // 注意:float 必须带 F 后缀,不然默认是 double,编译会出错 |
float 一定要在数字后面加 F 或 f,比如 36.5F。这是 C# 的规矩,不加 F 它就以为你是 double,往 float 里塞 double 会报错。
六、常用主力浮点:double
| 类型 | 范围(大约) | 占用空间 | 精度 |
|---|---|---|---|
double |
±1.79 × 10^308 | 8 字节 | 大约 15~16 位有效数字 |
例子
1 | // double 是「默认」的小数类型,数字后面什么后缀都不用加 |
float 和 double 怎么选?
简单记:
| 场景 | 用啥 |
|---|---|
| 内存敏感(比如要存几万个点的缓存) | float 够了 |
| 普通模拟量换算、计算结果 | 用 double,更精确 |
| 财务金额、计费 | 别用这两个! 用 decimal(本次没列在表里,先记下) |
上位机里常见的换算
很多 PLC 的模拟量原始值是 0~27648(西门子 S7-200 SMART 习惯),要换算成工程量:
1 | // 假设:0 对应 0°C,27648 对应 100°C |
可以看到除数和倍数都用了小数点(27648.0 而不是 27648),这样保证结果也是小数。
七、不是数字:对和错——bool
「布尔类型」就两个值:真(true)、假(false),不用纠结范围。
| 类型 | 取值 | 占用空间 |
|---|---|---|
bool |
true 或 false |
1 字节 |
例子
1 | bool isRunning = true; // 设备正在运行 |
上位机里啥时候用?
- 心跳信号:设备是不是还活着?
- 报警标志:温度超标了没有?
- 阀门状态:开/关。
- 通信结果:读寄存器成功了吗?
基本上所有「是不是 / 有没有 / 成功了没」的问题,答案都是 bool。
八、文本家族:char 和 string
char 是单个字符,string 是一串字符。
| 类型 | 含义 | 例子 |
|---|---|---|
char |
单个字符,用单引号 | 'A'、'你'、'1' |
string |
一串字符,用双引号 | "Hello"、"设备1号" |
例子
1 | char letter = 'A'; |
注意看引号:**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**(小数) |
| 计件、编号、不会为负 | uint 或 ulong |
| 时间戳、超大累计值 | long |
| 串口 / Modbus 单个字节 | byte |
| 温度、压力这类物理量 | double(精度好) |
| 内存吃紧、上万个点要存 | float |
| 金额、计费 | decimal(本次没列,先记下) |
| 是 / 否 / 开 / 关 | bool |
| 文本、点位名 | string |
看完表格,记住 int / double / bool / string 这四个是最常用的主力
看完表格,知道 byte/sbyte/short/ushort 是整型家族一员,只是大小不同
看完表格,知道 float 必须加 F 后缀,double 不用加
十一、一个能跑的小练习
把下面的代码复制进你的 Visual Studio,跑一下看看结果:
1 | using System; |
点我对照一下输出对不对
1 | 时间戳:1735872000123 |
能看到 设备在线:True,而不是 true,是因为 C# 把 bool 默认打印成首字母大写的形式,这是 .NET 的约定。
十二、小结
下一步建议:
- 在 Visual Studio 里把上面那段代码改一改——比如把
double改成float,看会报什么错。 - 试着把表里每一种类型都用一遍,每个类型随便赋值、打印一次。
- 接下来我们会学变量——怎么给数据起名字,怎么改值。
本笔记对应截图中的 11 种类型(Bool、SByte、Byte、Short、UShort、Int、UInt、Float、Long、ULong、Double、String),并补上了表格里没单独列出的
char,方便后续学文本时使用。




