(C语言基础)操作符详解2(数据在内存中的存储规则)以及字符串的倒置(详解)

简介: (C语言基础)操作符详解2(数据在内存中的存储规则)以及字符串的倒置(详解)

一、操作符详解2


1整数在内存中的存储规则


我们的机器通常分为32位和64位机器,其所对应的就是在硬件设备中的“特殊的线的数量”


会使我们在计算整型等类型中影响其字节数量。大部分我们所使用的编译器都是使用32位模式的,所以我们以下介绍32位机器中整数的存储规则。


首先,用户输入一个数,这个数在内存中是以二进制补码的形式存储的。正数的原码,反码,补码都相同,负数的原码,反码,补码都不同。我们将详细介绍负数的原,反,补码


#include<stdio.h>
int main()
{
    int a = -5;
    //-5的原码
    //10000000000000000000000000000101 -其中第一位是符号位
    //11111111111111111111111111111010 - 符号位不变,其他位按位取反,得到-5的反码
    //11111111111111111111111111111011 -反码加1得到-5的补码
    return 0;
}


2常见的操作符详解


(1)介绍按位或,与,异或的概念,并且利用异或操作符实现不创建新的变量达到交换两个数的值


数字在计算中是用其补码进行计算的


异或的概念,相同的为0,不同的为

按位与是有0为0,全1才为1

按位或是有1为1 ,全0为0


异或操作符实现不创建新的变量达到交换两个数的值


首先3和3异或为0,0和其他数异或,该数不变。所以,我们可以


#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  printf("交换前:a=%d b=%d\n", a, b);
  a = a ^ b;
  b = a ^ b;//a^b^b还是a
  a = a ^ b;//a^b^a=b;
  printf("交换后:a=%d b=%d\n", a, b);
  return 0;
}

(2)强制类型转换


int a = (int) 3.14;括号应该扩到类型上,不是数字上;


(3)sizeof是求一种类型的字节长度,也是一种单目操作符

int main()
{
  int a = 10;
  printf("%d\n", sizeof(a));
  printf("%d\n", sizeof(int));
  printf("%d\n", sizeof a);
  printf("%d\n", sizeof int);//注意int 的括号不能去掉
  return 0;
}

sizeof与数组的关系

#include<stdio.h>
void test1(int arr[])//int arr[] 等价于int* arr指针
{
  printf("%d\n", sizeof(arr));//数组传参都是传进来数组的首地址
}
void test2(int ch[])//int arr[] 等价于char* ch指针
{
  printf("%d\n", sizeof(ch));//数组传参都是传进来数组的首地址
}
int main()
{
  int arr[10] = { 0 };
  char ch[10] = { 0 };
  printf("%d\n", sizeof(arr));//40个字节
  printf("%d\n", sizeof(ch));//10个字节
  test1(arr);//4个字节
  test2(ch);//char类型的指针同样是4个字节
  return 0;
}


3整型提升


比方说char  a=5;  char  b=126;  a+b=?


整型提升

int main()
{
  char a = 5;
  //截断
  //00000000000000000000000000000101
  //00000101
  char b = 126;
  //00000000000000000000000001111110
  //01111110
  //当a和b相加的时候,a和b都是char类型
  // 表达式计算就要发生整型提升
  // 00000000000000000000000000000101
  // 00000000000000000000000001111110
  // 00000000000000000000000010000011-c
  // 最高位即符号位,若其为1,则全补1;为0则全补0;
  //
  char c = a + b;
//  10000011 - c
  //再发生一次整型提升
  //11111111111111111111111110000011-c补码
  //11111111111111111111111110000010-c的反码(补码-1)
  //10000000000000000000000001111101 - c的原码
  printf("%d\n", c);
  return 0;
}


4 关系操作符


>

>=

<

<=

!=(不等于)

==(判断是否相等)


5逻辑操作符


&&逻辑与-左操作数为假,右边不计算


|| 逻辑或-左操作数为真,右边不计算


360笔试题

#include<stdio.h>
int main()
{
  int i = 0, a = 0, b = 2, c = 3, d = 4;
  i = a++ && ++b && d++;
  //因为a本身为0,后置++,所以a++在表达式中值为0;为假,后面的操作均不执行,所以打印结果为
  //a=1,b=2,c=3,d=4
  printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
  return 0;
}


二、字符串的倒置


例子:将 I like beijing.

逆序为 beijing like I


思:将空格作为分割,先将每一部分逆序为I ekil gnijieb


再将I ekil gnijieb 全部逆序,为beijing like I


补充:scanf读入以空格为分界,gets是以回车为分界


代码实现


倒置字符串

比如i like beijing.

变成beijing i like.

#include<string.h>
#include<assert.h>
//assert是断言,是确保char*指针不为空指针NULL
void reverse(char* left, char* right)
{
  assert(left && right);
  while (left < right)
  {
  char tmp = *left;
  *left = *right;
  *right = tmp;
  left++;
  right--;
  }
}
int main()
{
  char arr[100] = { 0 };
  //输入
  gets(arr);
  //逆置
  int len = strlen(arr);
  //1 .逆置每个单词
  char* start = arr;
  char* end = start;
  while (*end !='\0')
  {
  while (*end != ' ' && *end !='\0')
  {
    end++;
  }
  reverse(start, end - 1);
  if (*end == '\0')
    start = end;
  else
  start = end + 1;
  end = start;
  }
  //2.整个字符串的逆序
  reverse(arr, arr + len - 1);
  //输出
  printf("%s\n", arr);
  return 0;
}
相关文章
|
2月前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
2月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
92 10
|
2月前
|
存储 数据管理 C语言
C 语言中的文件操作:数据持久化的关键桥梁
C语言中的文件操作是实现数据持久化的重要手段,通过 fopen、fclose、fread、fwrite 等函数,可以实现对文件的创建、读写和关闭,构建程序与外部数据存储之间的桥梁。
|
3月前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
3月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
111 11
|
3月前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
181 4
|
4月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
232 1
|
4月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
1月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
62 23
|
1月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
66 15

热门文章

最新文章