摆烂了一段时间……

本文详细介绍了C语言中的整数表示方法(原码、反码、补码),以及各种运算符(如移位、按位、逻辑和算术右移)的使用。还涵盖了临时变量、指针操作、类型转换、结构体和常量等内容,帮助读者理解C语言的基本概念和实践技巧。
摘要由CSDN通过智能技术生成

#include <stdio.h>
//2024.3.4
//int main() {
//    printf("%d\n", 153);
//    printf("%d\n", 0153);
//    printf("%d\n", 0x153);
//    //0开头数字编译器默认为8进制数
//    //0x开头数字编译器默认为16进制数
//    return 0;
//}
//int main() {
//    //正整数三码合一
//    int a = -10;
//    //负整数表示方式不同
//    //10000000000000000000000000001010 原码 最高位1代表负,0代表正
//    //11111111111111111111111111110101 反码 符号位(最高位)不变,其他按位取反
//    //11111111111111111111111111110110 补码 反码最低位+1
//    return 0;
//}
//整形内存中存的是补码,用补码计算
//CPU只做加法
//移位操作符,移动的是二进制位
//        << 左移操作符,左边抛弃,右边补0,左移一位有×2的效果
//        操作数只能是整数
//        >>右移操作符
//int main() {
//    int a = 6;
//    int b = (a << 1);
//    printf("%d\n", b);
//    printf("%d\n", a);
//    //a没有改变
//    return 0;
//}
//int main() {
//    int a = -6;
//    int b = (a << 1);
//    printf("%d\n", b);
//    printf("%d\n", a);
//    //b得到的是补码,打印的时候计算成原码,取反+1
//    return 0;
//}
//逻辑右移,类似于左移
//算数右移,更合理,右边丢1位,最高位按原来的符号填充
//具体哪一种取决于编译器实现,常见编译器都是算数右移
//int main() {
//    int a = -1;
//    int b = (a >> 1);
//    printf("%d\n", b);
//    printf("%d\n", a);
//    return 0;
//}
//int main() {
//    int a = 6;
//    a <<= 1;
//    printf("%d\n", a);
//    return 0;
//}
//位操作符,操作数必须是整数
//&按位与  &&逻辑与
//| 按位或  || 逻辑或
//^按位异或  ~按位取反
//int main() {
//    int a = 3;
//    int b = -5;
//    int c = a & b;
//    printf("%d\n", c);
//    return 0;
//}
//int main() {
//    int a = 3;
//    int b = -5;
//    int c = a | b;
//    printf("%d\n", c);
//    return 0;
//}
// ^ 按位异或 对应二进制位 相同为0 相异为1
//int main (){
//    int a=3;
//    int b=-5;
//    int c=a^b;
//    printf("%d",c);
//    return 0;
//}
// ~ 按位取反
//int main(){
//    int a=0;
//    int b=~a;
//    printf("%d",b);
//    return 0;
//}
//只针对整数
//不能创建临时变量实现两个整数的交换
//int main () {
//    int a = 3;
//    int b = 5;
//    printf("%d %d\n", a, b);
//    a=a^b;
//    b=a^b;
//    a=a^b;
//    return 0;
//}
//异或运算不会溢出
//临时变量的方法更好
//求一个整数在内存中二进制表示中1的个数
//可以考虑十进制采用取余的方式得到最后一位,除10缩小一位
//int main(){
//    int num;
//    scanf("%d",&num);
//    int count=0;
//    while(num){
//        int n;
//        n=num%2;
//        if(1==n){
//            count++;
//        }
//        num/=2;
//    }
//    printf("%d",count);
//    return 0;
//}
//上面代码对负数是有问题的
//可以unsigned int
//按位与
//int main (){
//    int num=0;
//    int count=0;
//    scanf("%d",&num);
//    for(int i=0;i<32;i++){
//        int n;
//        n=num&1;
//        num>>=1;
//        if(1==n){
//            count++;
//        }
//    }
//    printf("%d",count);
//    return 0;
//}
//上面写的不好
//int main () {
//    int n;
//    int count = 0;
//    scanf("%d", &n);
//    for (int i = 0; i < 32; i++) {
//        if (((n >> i) & 1 ) == 1) {
//            //注意运算优先级结合!!!
//            count++;
//        }
//    }
//    printf("%d", count);
//    return 0;
//}
//int main (){
//    int n=0;
//    scanf("%d",&n);
//    int count=0;
//    while(n){
//        n=n&(n-1);
//        //一个算法,将二进制中最右面的1去掉
//        count++;
//    }
//    printf("%d",count);
//    return 0;
//}
//不容易想到这种算法
//如何判断一个数是否是2的次方数,n&(n-1)==0
//int main() {
//    int n = 13;
//    n |= 1 << 4;
//    //把第五位改成1
//    printf("%d\n", n);
//    n &= (~(1 << 4));
//    //把第五位改成0
//    printf("%d\n", n);
//    return 0;
//}
//int main() {
//    int a = 1;
//    int b = 2;
//    int c = (a > b, a = b + 10, a, b = a + 1);
//    printf("%d", c);
//    return 0;
//}
//逗号表达式,从左向右计算,结果是最后一个表达式的结果
//可以写在while循环中,避免代码冗余
//下标引用操作符[]
//int main (){
//    int arr[10]={1,2,3,4,5};
//    printf("%d",arr[2]);
//    return 0;
//}
//函数调用操作符()
//最少接受一个操作数
//结构成员访问操作符
//结构体自定义类型
//关键字struct
//用来描述复杂对象
//struct Student {
//    char name[20];
//    int age;
//    int high;
//    float weight;
//    char id[16];
//} s4, s5, s6;//全局变量
//为了描述这个对象,自己创造的类型
//int main() {
//    struct Student s1 = {"张三", 20, 180, 75, "20246666"};//初始化
//    //局部变量
//    //可以不按照顺序
//    printf("%s %d %d %.2f %s",s1.name,s1.age,s1.high,s1.weight,s1.id);
//    //结构体变量.成员名
//    return 0;
//}
//操作符,优先级,结合性
//int main(){
//    char a=3;
//    char b=127;
//    char c=a+b;
//    printf("%d",c);
//    //-126
//    return 0;
//}
//整型提升,有符号变量按照符号位提升,无符号补0
//算数转换,小转大
//int main() {
//    int a = 10;
//    printf("%p", &a);
//    int* p = &a;
//    //指针变量,用来存地址
//    char ac = 'q';
//    char* pc = &ac;
//    return 0;
//}
//int main() {
//    int a = 10;
//    int* p = &a;
//    printf("%d", *p);
//    //解引用操作符,间接访问操作符,找到了a
//    return 0;
//}
//int main() {
//    printf("%zd\n", sizeof(int*));
//    printf("%zd\n", sizeof(double*));
//    printf("%zd\n", sizeof(char*));
//    //指针变量大小取决于计算机位数
//    return 0;
//}
//指针类型决定了指针进行解引用操作的时候访问几个字节,也就是决定了指针的权限
//int main() {
//    int a = 0x11223344;
//    int* p = &a;
//    *p=0;
//    return 0;
//}
//void*  无具体类型指针,泛型指针
//int main(){
//    int a=0;
//    float f=0;
//    void* p=&a;
//    p=&f;
//    //不确定地址用void型的指针接受
//    return 0;
//}
//局限性 不能解引用 无具体类型不知道访问几个字节 不能进行指针运算
//一般用在函数参数的时候,用来接收不同数据类型的地址 实现泛型编程 是一个函数来处理多种类型的数据
//const 修饰指针
//const int a a不能被通过a更改,具有常属性,本质上是变量,在C语言中
//在C++中,const修饰的变量就是常量,const int a a是常量
//int main() {
//    const int a = 20;
//    int* p = &a;
//    *p = 0;
//    printf("a = %d\n", a);
//    return 0;
//}
//这是不希望发生的,a的值被改变了,编译器警告了
//const修饰指针变量
//int main(){
//    int a=10;
//    int* const p=&a;
//    //这里const修饰p,p的值不能更改,指向的变量不会变,地址不变,但是,变量的值可以被更改
//    return 0;
//}
//
//int main(){
//    int a=10;
//    int const *p=&a;
//    //const 放在星号右边,修饰的是*p,即p指向的变量,不能通过指针修改
//    return 0;
//}
//但是可以修改指针变量本身的值,就是可以改变指针的指向
//int main() {
//    int a = 10;
//    int b = 100;
//    int const*const p = &a;
//    //*P = 0;
//    //p = &b;
//    //这是不被允许的什么都改变不了
//    return 0;
//}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值