char型变量是有符号还是无符号?

发布于:2022-12-10 ⋅ 阅读:(450) ⋅ 点赞:(0)

char型变量是有符号还是无符号?

在这里插入图片描述

前言

charC 语言里的一个基本数据类型。这样一个数据类型在内存中占的字节数是多少呢?


一、各种数据类型

首先,在 C 中,基本数据类型及其占用的字节数如下表所示。

数据类型 32位系统 64位系统
signed char 1 1
unsigned char 1 1
signed short int 2 2
unsigned short int 2 2
signed int 4 4
unsigned int 4 4
signed long 4 8
unsigned long 4 8
signed long long 8 8
unsigned long long 8 8
float 4 4
double 8 8
指针变量 4 8

可见 -> 有符号、无符号不影响占的字节个数
一般不标注 signedunsigned 时,会默认是 signed,但是,全是如此吗?


二、有符号 or 无符号

根据 C99 标准,不带前缀的 char 是否有符号 取决于编译器,是 Implementation Defined 的。永远不要假设 char有符号或无符号 的,因为它可以并且确实会有所不同。
在C语言的头文件limits.h中,对 charsigned charunsigned char 是分开描述的,表示这三者是不同的。
一般来说,选择的是 在他们的架构上实现更有效的那个

目前已知的各编译器对 char 的处理情况如下表所示:

编译器 有无符号
KEIL C51
KEIL ARM
VC
GCC(win / linux)
arm-linux-gcc

三、测试

TODO


总结

C 语言的各种基本数据类型的应用的重要性在嵌入式领域尤为突出,嵌入式设备一般内存有限,如何用尽量少的存储空间来实现可靠的功能,是需要关注的问题。

另外,一般情况下,在 C 语言中隐式转换数据类型遵循长度小的向长度大的转换,有符号向无符号转换,字符型转换为整形。

所以,我们定义的变量,以及在程序运行过程中,每个变量到底是有符号的还是无符号的是需要关注的点。为了程序的可移植性,不要用 char,而 要标注是否带符号

另外,在整数的双目运算符中,如果两个整数数据的符号类型不一致,那么在运算时会转换成无符号进行运算。即原先有符号的会转换成无符号的进行运算。

参考

https://zditect.com/article/31758836.html
https://www.cnblogs.com/long5683/p/9321559.html
https://www.php.cn/faq/485433.html
https://blog.csdn.net/weixin_44567318/article/details/116869867