C语言数据类型和格式化输出总结

时间:2022-09-24 15:37:45

1 编译型和解释型语言的区别

a执行效率  
b平台无关性  

2 gcc -E/-S/-C/-O 参数的意义

gcc -E 预处理:进行预处理
gcc -S 编译:将代码翻译成汇编语言
gcc -C 汇编:将汇编文件转换为二进制目标代码
gcc -O 链接:生成可执行文件
***

3 求余与除法

-7/3 = -2 因为-2*3 = -6。 -6+(-1) = -7。因此取余为-1
同理可知7%-3 = 1。
可总结出取余的正负与被除数相同

-7/3=-2 -7%3=-1  
7/-3=-2  7%-3=1  

4 不用第三方变量进行数据交换

方法一:

#include<stdio.h>
int mian()
{
    int a = 10, b = 5;
    a = a + b;
    b = a - b;
    a = a - b;
    printf("a = %d b = %d",a,b);
    return 0;
}

方法二:

#include<stdio.h>
int mian()
{
    int a = 10, b = 5;
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("a = %d b = %d",a,b);
    return 0;
}

5补码。。查看书籍《编码》

个人理解:
首先要理解一个原则,数据定义后如果不去修改它的话,其在内存中是以补码的形式存在的,并且该补码数值不会更改。
unsigned int a = -1 一旦声明 -1 就以 int 型的形式将-1 的补码存储在内存中,而内存中这个值是不变的, 就看编译器如何去解读。比如,此次我们都将 -1 的补 码以unsigned int类型去解释。我们知道int 型的 -1 在内存中是以补码存储的,其补码为
1111 1111 1111 1111 1111 1111 1111 1111

如果我们以int去解释这个补码的话,该补码对应的int 值就是 -1

如果我们以unsigned int 去解释这个补码的话,该补码对应的就不是 -1了,而是二进制的 1111 1111 1111 1111 1111 1111 1111 1111 这将是很大的一个数。

因此printf("a = %u\n",a);将输出4294967295,即上面的二进制转换为十进制的值

当执行printf("a + b = %d\n",a+b);时,a + b不同类型的数据要进行运算时,会进行隐式转换,将 a 隐式转换成 int 型,即以int型去解释a,此时 a 的值即为-2。故 a + b = -2 +2 =0。因此,输出为0

#include <stdio.h>  
int main(int argc, char *argv[])
{
        unsigned int a =-1;
        int b = 1;
        printf("a = %u\n",a);
        printf("b = %u\n",b);
        printf("a + b = %d\n",a+b);
        return 0;
    }  

下面这条语句将输出129.因为-127在计算机中是以补码 1000 0001形式存储的。将它强制转换为unsigned char,则其对应的值为129.因此%d输出为129

printf("%d\n",(unsigned char)(-127));

下面这两条语句输出结果都是4294967295

printf("%u\n",(unsigned int)(-1));
printf("%u\n",-1);

下面这两条语句都输出-1,格式化输出 , 后面表示该数据类型是什么,要从该数据的其实指针去读多少个字节。而格式化输出%d或%u等表示以什么样的形式去解读这些字节。

printf("%d\n",(unsigned int)(-1));
printf("%d\n",-1);

下面这条语句的输出为

-129
4294967167
#include<stdio.h>
int main()
{
    int a = -129;
    printf("%d\n",(unsigned int )(a));
    printf("%u\n",a);
}

6转义字符

printf("\\= %d  \\ = %d",'\\','\\');//输出 \= 92  \ = 92

printf("\"= %d  \" = %d",'"','\"');//输出 "= 34  " = 34