char型变量是有符号还是无符号?
前言
char 是 C 语言里的一个基本数据类型。这样一个数据类型在内存中占的字节数是多少呢?
一、各种数据类型
首先,在 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 |
可见 -> 有符号、无符号不影响占的字节个数
一般不标注 signed 或 unsigned 时,会默认是 signed,但是,全是如此吗?
二、有符号 or 无符号
根据 C99 标准,不带前缀的 char 是否有符号 取决于编译器,是 Implementation Defined 的。永远不要假设 char 是 有符号或无符号 的,因为它可以并且确实会有所不同。
在C语言的头文件limits.h中,对 char、signed char、unsigned 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