C语言的关键字有大致可以分为以下几类:
1. 数据类型关键字:
- char:用于声明字符类型。
- int:用于声明整数类型。
- float:用于声明单精度浮点数类型。
- double:用于声明双精度浮点数类型。
- short:用于声明短整数类型。
- long:用于声明长整数类型。
- signed:用于声明有符号类型。
- unsigned:用于声明无符号类型。
- void:用于声明无返回值或不带参数的函数。
2. 控制流程关键字:
- if:用于条件语句,执行满足条件的代码块。
- else:用于条件语句的可选分支,执行不满足条件的代码块。
- switch:用于多重条件语句,根据不同的条件执行相应的代码块。
- case:在switch语句中用于定义各个条件的代码块。
- break:用于跳出循环或switch语句。
- default:在switch语句中用于定义默认的代码块。
3. 循环关键字:
- for:用于循环执行一段代码,带有初始值、条件和更新表达式。
- while:用于循环执行一段代码,根据条件判断是否继续执行。
- do:用于循环执行一段代码,先执行一次,再根据条件判断是否继续执行。
4. 存储类关键字:
- auto:用于声明自动存储类的变量。
- register:用于声明寄存器存储类的变量。
- static:用于声明静态存储类的变量。
- extern:用于声明外部链接的变量或函数。
5. 其他关键字:
- const:用于声明常量,表示值不可修改。
- enum:用于定义枚举类型。
- sizeof:用于获取数据类型或变量的大小。
- typedef:用于创建自定义的数据类型别名。
- return:用于函数中返回值或退出函数。
- continue:用于结束当前循环的迭代,继续下一次迭代。
- goto:用于无条件跳转到代码中的标签位置。
数据类型关键字在C语言中用于声明不同类型的变量。
1. char:
- char用于声明字符类型的变量。
- char类型变量可以存储单个字符,如字母、数字或符号。
- 通常占用一个字节的内存空间。
2. int:
- int用于声明整数类型的变量。
- int类型变量可以存储整数值,包括正数、负数和零。
- 通常占用四个字节的内存空间。
3. float:
- float用于声明单精度浮点数类型的变量。
- float类型变量可以存储小数值,具有较小的精度。
- 通常占用四个字节的内存空间。
4. double:
- double用于声明双精度浮点数类型的变量。
- double类型变量可以存储更大范围和更高精度的小数值。
- 通常占用八个字节的内存空间。
5. short:
- short用于声明短整数类型的变量。
- short类型变量可以存储整数值,但范围较小。
- 通常占用两个字节的内存空间。
6. long:
- long用于声明长整数类型的变量。
- long类型变量可以存储更大范围的整数值。
- 通常占用四个或八个字节的内存空间。
7. signed:
- signed用于声明有符号整数类型的变量。
- signed修饰的整数变量可以表示正数、负数和零。
- 默认情况下,int类型被视为有符号类型。
8. unsigned:
- unsigned用于声明无符号整数类型的变量。
- unsigned修饰的整数变量仅表示非负数和零。
- 使用unsigned可以扩展可表示的正数范围。
在计算机中,用于表示有符号整数的三种表示方式是原码、反码和补码。
1. 原码(Sign-Magnitude):
- 原码是最简单的表示方式,符号位和数值位分开表示。
- 符号位为0表示正数,为1表示负数。
- 数值位按照常规二进制表示数值的绝对值。
- 例如,+7的原码为 0000111,-7的原码为 1000111。
2. 反码(One's Complement):
- 反码是在原码的基础上,负数的数值位按位取反(0变为1,1变为0)。
- 正数的反码与原码相同。
- 例如,+7的反码为 0000111,-7的反码为 1111000。
3. 补码(Two's Complement):
- 补码是在反码的基础上,再加1。
- 补码是计算机中最常用的表示有符号整数的方式。
- 正数的补码与原码相同。
- 例如,+7的补码为 0000111,-7的补码为 1111001。
补码表示方式有以下优点:
- 0的表示唯一。
- 可以直接进行加减法运算,无需考虑符号位。
- 在计算机中使用固定位数表示有符号整数时,补码可以更高效地表示负数。
需要注意的是,正数的原码、反码和补码都相同。而负数的反码和补码是不同的,补码比反码多加了一个1。
这些表示方式对于计算机内部处理有符号整数和实现算术运算都起到了重要作用,但在实际编程中,我们一般不需要直接操作原码、反码和补码,而是由计算机硬件自动处理这些转换。
数据过大发生回滚
在C语言中,当一个整数值超出了char类型的取值范围时,会发生截断(truncation)或回滚(wrap-around)的现象,具体取决于数据类型和编译器的实现。
对于char类型,通常是一个字节(8位),取值范围是-128到127(有符号char)或0到255(无符号char)。
如果将一个超出char取值范围的整数值赋给char类型的变量,发生回滚的情况下,整数值会按照模运算的方式进行回滚,即超出范围的部分被截断。例如,对于有符号char类型,当超过范围时,会将最高位的1看作符号位,剩余的位数表示数值。
以下是一些示例说明:
char x = 127; // 最大值
x = x + 1; // 发生回滚
printf("%d\n", x); // 输出结果为 -128
char y = -128; // 最小值
y = y - 1; // 发生回滚
printf("%d\n", y); // 输出结果为 127
```
需要注意的是,超出char范围的截断或回滚可能会导致数据丢失和不可预期的结果。因此,在进行数值计算时,应根据具体情况选择合适的数据类型,以避免截断和溢出的问题。如果需要更大的整数范围,可以考虑使用short、int、long等整数类型。