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