整型
short
大小
- 16 位(2 字节)
- 由于它是整型,所以内存中的布局取决于系统的字节序(大端或小端)。
字节序
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
unsigned int x = 0x12345678;
char* c = (char*)&x;
if (*c == 0x78) { //*c代表x在内存地址上的第一个字节
printf("Little endian");
}
else {
printf("Big endian");
}
return 0;
}
范围
short
: -32,768 - 32,767unsigned short
: 0 - 65,535 (2^8=65536)
溢出
- 如果对
short
变量赋值超出其范围,将会发生溢出。例如,尝试将 32,769 赋值给一个有符号short
变量会导致溢出。 - 溢出会导致变量值“环绕”回其范围的另一端。例如,如果
short
变量的值为 32,767,然后增加 1,它将变为 -32,768。
int
大小
- 32 位(4 字节)
范围
int
: -2,147,483,648 - 2,147,483,647unsigned int
: 0 - 4,294,967,295 (2^32)
long
long类型和指针类型需要特别注意,编写跨平台的软件时尽量不要使用long类型,或者需要对long类型做特殊处理。
大小
- widows4字节,linux32位4字节,linux64位8字节
范围
long
: -2,147,483,648 - 2,147,483,647unsigned long
: 0 - 4,294,967,295 (2^32)
long long
大小
- 64 位(8 字节)
范围
long long
: -9,223,372,036,854,775,808 - 9,223,372,036,854,775,807unsigned long long
: 0 - 18,446,744,073,709,551,615 (2^64)
字符型
char
适用于需要存储单个字符的场景
大小
- 8 位(1 字节)
范围
- char: -128 - 127
- unsigned char: 0 - 255
wchar_t
对比一下wchar_t
和char
,这两个在C/C++编程中常用的数据类型。
- 存储大小:
char
:通常占用1个字节(8位)的存储空间。它被用来存储ASCII字符集中的字符,因为ASCII字符集只需要7位就能表示所有的字符。wchar_t
:宽字符类型,通常占用2个或4个字节。它被用来存储宽字符,比如Unicode字符集中的字符。Unicode字符集包含了世界上大多数文字系统的字符,所以需要更多的存储空间。
- 用途:
char
:主要用于处理ASCII字符集或单字节编码的字符集。在C/C++中,它是最基本的字符类型。wchar_t
:用于处理宽字符集,如Unicode。它允许你处理包含非ASCII字符的文本,这对于国际化和本地化非常重要。
- 可移植性:
char
:在所有C/C++实现中都是1个字节,具有很好的可移植性。wchar_t
:大小依赖于实现和平台。在32位系统中,它通常是4字节,在16位系统中,通常是2字节。这种差异可能导致代码在不同平台上的行为不一致。
- 字符串表示:
char
:在C/C++中,char
数组或指针常用来表示和操作字符串。wchar_t
:用于表示宽字符串,通常在字符串前加上L
前缀,如L"Hello World"
。
- 标准库支持:
char
:标准库中的大多数字符串处理函数,如strlen
、strcpy
等,都是针对char
类型设计的。wchar_t
:C/C++标准库也提供了一些宽字符串处理函数,如wcslen
、wcscpy
等,用于处理wchar_t
类型的字符串。
总的来说,char
和wchar_t
的主要区别在于它们存储字符的方式和大小。char
适用于ASCII或单字节编码的字符,而wchar_t
则用于处理需要更多存储空间的宽字符,如Unicode字符。不过,由于wchar_t
的大小依赖于平台,现代C++更倾向于使用char16_t
、char32_t
以及Unicode字符串字面量来处理Unicode字符,以提供更好的可移植性和一致性。
布尔类型
布尔类型用于存储真(true)或假(false)的值。
bool
- 通常占用1字节。
- 取值为
true
或false
。
浮点类型
(歪个楼,我的Cybery宝宝回答的比智谱清言要好欸)
(再歪一下,过两天给宝做个自己的皮套💕)
float
大小
通常占用4个字节(32位)的存储空间。
表示
根据IEEE 754标准,一个float类型的值通常包括1位符号位、8位指数位和23位尾数位。
浮点数的表示
浮点数的表示类似于科学记数法,它由两部分组成:一个基数和一个指数。在浮点数的二进制表示中,基数通常是2(对于十进制浮点数,基数是10),而指数和尾数则用特定的位来表示。
- 尾数位(Fraction/Mantissa)
尾数位(或尾数)是浮点数中用来表示数字的“有效数字”部分,也就是不包括前导的1(对于规范化浮点数)或0(对于非规范化浮点数)的部分。尾数位决定了浮点数的精度,就像尺子上的刻度越密,你就能越精确地测量长度一样。
在IEEE 754标准中,尾数位通常省略了最前面的1(因为规范化浮点数的第一个有效数字总是1),所以尾数位实际上表示的是小数点后的部分。例如,对于二进制数1.101,尾数位就是101。 - 指数位(Exponent)
指数位表示2的幂次,它决定了尾数位应该乘以2的多少次方。在IEEE 754标准中,指数位是一个带偏移的值,这意味着实际指数是指数位表示的值减去一个固定的偏移量(对于单精度浮点数,这个偏移量是127)。
例如,如果指数位表示的值是130(二进制为10000010),那么实际的指数是130 - 127 = 3。这意味着尾数位应该乘以2^3,也就是8。 - 结合尾数位和指数位
对于二进制表示的浮点数0 10000010 10100000000000000000000
:- 符号位:0(表示正数)
- 指数位:10000010(二进制),转换为十进制是 130,减去偏移量 127,得到实际指数是 3。
- 尾数位:10100000000000000000000,加上隐含的 1(对于规范化浮点数),实际尾数是
1.10100000000000000000000
(二进制)。
现在,让我们将尾数转换为十进制:
1.10100000000000000000000(二进制)= 1 * 2^0 + 1 * 2^-1 + 0 * 2^-2 + 1 * 2^-3 + … (只有前三位的计算对最终结果有影响,因为后续的0不改变值)
= 1 + 0.5 + 0 + 0.125 + … (其他位都是0,所以可以忽略)
= 1.625(十进制)
现在,将尾数乘以 2 的指数:
1.625 * 2^3 = 1.625 * 8 = 13(十进制)
- 尾数位(Fraction/Mantissa)
它能提供大约6-7位的十进制精度。
float类型通常用于那些不需要非常高精度的计算,或者当你需要大量浮点数并且内存使用效率很重要时。
double
精度
double
通常占用64位(8字节)的存储空间。在大多数现代计算机中,按照IEEE 754标准,double
可以提供大约15-17位十进制数的精度。
表示范围
double
能表示的数值范围大约在10^-308到10^308之间。这意味着它既可以表示非常小的数,也可以表示非常大的数。
默认初始化值
如果你声明了一个double
变量但没有初始化它,它将包含一个未定义的值,通常是垃圾数据。
long double
long double通常比double占用更多的存储空间,具体大小依赖于平台和编译器。在一些系统上,它可能占用96位或128位(12或16字节),但这并不是固定的。
转义字符
转义字符 | 含义 | ASCII码值(十进制) |
---|---|---|
\a | 警报 | 007 |
\b | 退格(BS),将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF),将当前位置移到下一行开头 | 010 |
\r | 回车(CR),将当前位置移到本行开头 | 013 |
\t | 水平制表(HT)(跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\ | 反斜线字符 | 092 |
' | 单引号 | 039 |
" | 双引号 | 034 |
? | 问号 | 063 |
\0 | 数字0 | 000 |
\ddd | 8进制转义字符,d范围0-7 | 3位8进制 |
\xhh | 16进制转义字符,h范围0-9,a-f,A-F | 3位16进制 |
字符串型
C风格字符串
char 变量名[] = “字符串值”
1 | int main() { |
char str1[]
和 char* str1[]
在C语言中是两种不同的声明方式,它们分别表示不同的数据类型和内存布局。
char str1[]
:- 这是一个字符数组,它声明了一个数组,其元素类型为
char
。 - 这个数组可以存储一系列的字符,并且这些字符连续存储在内存中。
- 声明时可以指定数组的大小,也可以在初始化时由编译器自动计算大小。
- 例如:
char str1[] = "Hello, World!";
这里str1
是一个字符数组,包含字符串 “Hello, World!” 以及一个空字符\0
作为字符串的结束标志。
- 这是一个字符数组,它声明了一个数组,其元素类型为
char* str1[]
:- 这是一个指向字符的指针数组,它声明了一个数组,其元素类型为
char*
。 - 这个数组中的每个元素都是一个指向
char
类型的指针,也就是说,每个元素都可以指向一个字符串。 - 常用于声明一个字符串数组,每个元素都是指向不同字符串的指针。
- 例如:
char* str1[] = {"Hello", "World", "!"};
这里str1
是一个指针数组,其中str1[0]
指向字符串 “Hello”,str1[1]
指向字符串 “World”,以此类推。
以下是一个具体的例子来说明两者的不同:在这个例子中,1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main() {
// 字符数组
char str1[] = "Hello, World!";
// 指向字符的指针数组
char* str2[] = {"Hello", "World", "!"};
// 输出 str1
printf("str1: %s\n", str1);
// 输出 str2 中的每个字符串
printf("str2[0]: %s\n", str2[0]);
printf("str2[1]: %s\n", str2[1]);
printf("str2[2]: %s\n", str2[2]);
return 0;
}str1
是一个包含 “Hello, World!” 字符串的字符数组,而str2
是一个包含三个字符串指针的数组。
- 这是一个指向字符的指针数组,它声明了一个数组,其元素类型为
C++风格字符串
string 变量名 = “字符串值”
1 | int main() { |
###########################完结撒花###########################