C语言之数据类型

数据类型

  • 数据类型的本质就是一个模子。
  • 数据类型代表需要占用的内存的大小。

图示

变量

  • 变量的本质是内存中一段连续存储空间的别名。
  • 程序中通过变量来申请并且命名存储空间。
  • 通过变量的的名字可以使用存储空间。

初始化变量

  • 软件在运行前需要向操作系统申请存储空间,在内存空间足够空闲时,操作系统将分配一段内存空间并将该外存中软件拷贝一份存入该内存空间中,并启动该软件运行。
  • 在软件运行期间,该软件所占内存空间不再分配给其他软件。
  • 当该软件运行完毕后,操作系统将回收该内存空间(注意:操作系统并不清空该内存空间遗留下来的数据),以便再次分配给其他软件使用。综上所述,一个软件所分配到的空间中极可能存在着以前其他软件使用过后的残留数据,这些数据被称之为垃圾数据。所以通常情况下我们为一个变量,为一个数组,分配好存储空间之前都要对该内存空间初始化。

对应进制数

控制符的操作

printf()函数的使用

# include <stdio.h>

int main(void)
{
	//printf("哈哈!
");  // 
表示换行
	
    //	int i = 10;
    //	printf("%o
", i);  //i是整形,应该是%d

	int j = 3;
	int k = 5;
	//printf("%d %d
", j, k);  //OK
	//printf("%d
", j, k);  //error 输出控制符和输出参数的个数不匹配
	printf("i = %d, j = %d
", j, k);

	return 0;
}

printf()对应的格式化字符

%d int
%ld long int
%c char
%f float
%lf double
%x int 或者long int 或者 short int
%o 同上
%s 字符串

Scanf()函数的用法

功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。

语法

scanf("输入控制符", 输入参数)

代码示例:

# include <stdio.h>
int main(void)
{
    // 定义变量i ch
    int i;
    char ch;
    
    scanf("%d", &i);//&i 表示i的地址 &是一个取地址符
    printf("i = %d
", i);
    scanf("%c", &ch);
    printf("ch = %c
", ch);
    
    return 0;
}

强制类型转换

  1. 大类型赋值给小类型时,又可能发生溢出。
    • 当数值在小类型范围内,赋值成功。
    • 当数值超过小类型的范围,发生溢出。
  2. 小类型可以安全的赋值给大类型。
  3. 浮点类型赋值给整形,会发生截断。(小数部分丢失)
  4. 整型赋值给浮点类型,能够完成。

代码示例

#include <stdio.h>

int main()
{
    // 定义变量
    int a = 50000;
    short b = 0;

    int i = 0;
    float f = 0.2;

    printf("a = %d
", a);  // a=50000
    printf("b = %d
", b);  // b=0
    printf("
");

    b = a;

    printf("a = %d
", a);  // a=50000
    printf("b = %d
", b);  // b = -15536
    printf("
");

    b = 30000;
    a = b;

    printf("a = %d
", a); // a = 30000
    printf("b = %d
", b);  // b = 30000
    printf("
");
    printf("
");

    printf("i = %d
", i);  // 0
    printf("f = %f
", f);  // 0.200000
    printf("
");

    f = 3.14f;
    i = f;

    printf("i = %d
", i);  // i=3
    printf("f = %f
", f);  // 3.140000

    return 0;
}

逻辑运算与位运算

逻辑运算

  • 逻辑运算的参与者为逻辑值(真或假)。
  • 任何非零值在逻辑运算中都为真。
  • 任何零值在逻辑运算中都为假。

图示:

&&运算

  • 从左向右进行,如果一个操作数为假,则表达式为假。
  • 第一个为假的操作数之后的其他操作数不在计算。

||运算

  • 从左向右进行,如果有一个操作数为真,则整个表达式为真
  • 第一个为真的操作数之后的其他的操作数不在计算。

取非运算(!)

  1. 单目运算(只需要一个操作数),运算结果为逻辑值。

    • 对真值取非的结果为假。

    • 对假值取非的结果为真。

代码示例

#include <stdio.h>

int main()
{
    int a = 1;
    int b = 2;
    int c = 0;

    c = a && b;

    printf("c = %d
", c);

    c = !(a - b) || (c < b);

    printf("c = %d
", c);

    c = 10000;
    c = !!c;

    printf("c = %d
", c);

    return 0;
}

位运算

位运算(&, |, ~, ^, <<, >>)

  • 直接对数据的二进制位进行操作。
  • 位运算的基本单位是二进制,所以也是一种0和1的操作。
  • 可以使用括号()改变位运算的运算顺序。
  • 位运算的操作数只能是整型数。(浮点数不能直接进行位运算)
运算符 含义 示例 优先级
~ 按位求反 01011010 1
<< 左移:高位移出,低位补零 0011 << 1 ~ 0110 2
>> 右移:低位移出,高位补符号位 0101 >> 2 ~ 0001 2
& 按位与 0111 & 1100 ~ 0100 3
^ 按位异或:相同为0,不同为1 0111 ^1100 ~ 1011 4
| 按位或 0111 | 1100 - 1111 5

注意:

  • 按位与和逻辑与的计算法相同:两者为1,结果为1,否则为0.
  • 按位或和逻辑或的计算法相同:两者为0,结果为0,否则为1。

代码示例

#include <stdio.h>

int main()
{
    printf("c = %d
", 5 | 2); // 7
    printf("c = %d
", 7 ^ 8); // 15
    printf("c = %d
", 2 ^ 3); // 1
    printf("c = %d
", (15 >> 2) & 13); // 1
    printf("c = %d
", 173 ^ 60); // 145

    return 0;
}

有符号和无符号

数据类型的最高位用于标识数据的符号。

最高位为1,表示这个数为负数。
最高位为0,表示这个数为正数。

有符号数的表示法

1.在计算机内部用补码表示有符号数。

  • 正数的补码为正数本身。
  • 负数的补码为负数的绝对值各位取反后加1

无符号数表示法

2.在计算机内部用原码表示无符号数

- 无符号数默认为正数。
- 无符号数没有符号位。

signed和unsigned

  • C语言中变量默认为有符号的类型。
  • unsigned关键字声明变量为无符号类型。
  • C语言中只有整数类型才能够声明unsigned变量

代码示例

#include <stdio.h>

int main()
{
 	// 定义无符号数变量
    unsigned int i = 5;
    // 定义变量
    int j = -10;
    
    if( (i + j) > 0 )
    {
        printf("i + j > 0
");
    }
    else
    {
        printf("i + j <= 0
");
    }
    
    return 0;
}

注意

当无符号数与有符号数混合计算时候,会将有符号数转换为无符号数再进行计算,结果为无符号数。
原文地址:https://www.cnblogs.com/Guard9/p/12905140.html