(c语言进阶)数据存储——整形存储

news/2024/10/11 15:56:06/

 1.Release程序运行时会对Debug程序进行优化

例如将变量创建在数组之后,避免了数组越界引用时导致死循环的可能。

2.整形变量所占空间的大小 

3.构造类型

      数组的类型为去掉数组名之后的剩余部分

 4.指针类型

 5.空类型

 

 6.数值的不同表现形式

 

7.数据在内存中的两种存储方式 

计算机的选择哪种存储方式,取决于硬件设施 ,一般都采用小端存储

#include<stdio.h>    //判读大小端存储
int main()
{
    int a = 1;
//注:内存在存储时以二进制存储,一个字节占一个内存单元
//00000000 00000000 00000000 00000001——(int)a  二进制
//00 00 00 01——(int)a  十六进制
//00000001——(char)a  二进制
//01——(char)a  十六进制

    if (*(char*)&a == 1)
    {
        printf("小端存储");
    }
    else
    {
        printf("大端存储");
    }
    return 0;

8.有符号变量与无符号变量取值范围的计算方法

 

9.习题 

 (1)第一题

题目:计算输出结果

解析: 

答案:-1 ,-1,255

#include<stdio.h>
int main()
{
    char a = -1;
//10000000 00000000 00000000 00000001——int(-1) 原码
//11111111 11111111 11111111 11111110——int(-1) 反码
//11111111 11111111 11111111 11111111——int(-1) 补码
//11111101——char(-1)

    signed char b = -1;
//10000000 00000000 00000000 00000001——int(-1) 原码
//11111111 11111111 11111111 11111110——int(-1) 反码
//11111111 11111111 11111111 11111111——int(-1) 补码
//11111111——signed char(-1)

    unsigned char c = -1;
//10000000 00000000 00000000 00000001——int(-1) 原码
//11111111 11111111 11111111 11111110——int(-1) 反码
//11111111 11111111 11111111 11111111——int(-1) 补码
//11111111——unsigned char(-1)

    printf("a=%d,b=%d,c=%d",a,b,c);
//整形输出需要整形提升
//char (-1)提升后:
//11111111 11111111 11111111 11111111——int补码
//11111111 11111111 11111111 11111110——int 反码
//10000000 00000000 00000000 00000001——int 原码 =(-1)

//signed char (-1)提升后:
//11111111 11111111 11111111 11111111——int 补码
//11111111 11111111 11111111 11111110——int 反码
//10000000 00000000 00000000 00000001——int 原码 =(-1)

//unsigned char (-1)提升后
//00000000 00000000 00000000 11111111——int 补码=原码=255

    return 0;
}

(2)第二题 

 题目: 计算输出结果

解析:

答案: 4,294,967,168

#include<stdio.h>
int main()
{
    char a = -128;
//10000000 00000000 00000000 10000000——int (-128) 原码
//11111111 11111111 11111111 01111111——int (-128) 反码
//11111111 11111111 11111111 10000000——int (-128) 补码
//10000000——char (-128)

    printf("%u\n",a);
//整形提升后:
//11111111 11111111 11111111 10000000——unsigned int 补码=4,294,967,168
    
return 0;
}

 (3) 第三题

题目: 计算输出结果

 

解析: 

 答案:-10

#include<stdio.h>
int main()
{
    int i = -20;
//10000000 00000000 00000000 00010100——int(-20) 原码
//11111111 11111111 11111111 11101011——int(-20) 反码
//11111111 11111111 11111111 11101100——int(-20) 补码

    unsigned int j = 10;
//00000000 00000000 00000000 00001010——unsigned int (10) 原码=补码
    printf("%d\n",i+j);
//有符号变量与无符号变量进行算数运算时,需要进行类型转换
//10000000 00000000 00000000 00010100——unsigned int (-20) 提升后
//00000000 00000000 00000000 00001010——unsigned int (10) 原码=补码
//10000000 00000000 00000000 00001010——unsigned int  (-20)-(10)

//以整形输出时,无符号整形需类型转换
//10000000 00000000 00000000 00001010——int (-20)-(10)=(-10)

    return 0;
}

(4)第四题

 题目:计算输出结果

解析: 

答案:当i=0时,执行i--后变为一个极大值,死循环

#include<stdio.h>
int main()
{
    unsigned int i;
    for (i = 9; i >= 0; i--)
    {
        printf("%u\n",i);
    }
//当i=0时,执行i--
//00000000 00000000 00000000 00000000——int (0)
//00000000 00000000 00000000 00000000——unsigned int (0) 类型转换后

//10000000 00000000 00000000 00000001——int (-1) 原码
//11111111 11111111 11111111 11111110——int (-1) 反码
//11111111 11111111 11111111 11111111——int (-1) 补码
//11111111 11111111 11111111 11111111——unsigned int (-1) 类型转换后 =4,294,967,295

    return 0;
}

 (5)第五题

题目:计算输出结果

解析: 

答案:255

#include<stdio.h>
#include<string.h>
int main()
{
    char a[1000];
//char的取值范围-128~127
    int i = 0;
    for (i = 0; i < 1000; i++)
    {
        a[i] = -1 - i;        
    }
//故无论怎么循环,a[i]的取值范围都为a[-128]~a[127]
    printf("%d",strlen(a));
//128+127=255
//strlen()函数的返回值为unsigned int类型

    return 0;
}

 

 (6)第六题

题目: 计算循环次数

解析: 

答案:死循环

#include<stdio.h>
unsigned char i = 0;
int main()
{
    for (i = 0; i <=255; i++)
    {
        printf("Hello world\n");
    }
//当i=255时,i++后
//11111111——unsigned char (255)
//00000000——unsigned char (255)+(1)=0
//........

    return 0;
}

(7)第七题 

题目: 

解析: 

答案:>

#include<stdio.h>
#include<string.h>
int main()
{
//strlen()函数返回值类型为unsigned int
//00000000 00000000 00000000 00000011——unsigned int (3)
//00000000 00000000 00000000 00000110——unsigned int (6)
//00000000 00000000 00000000 00000011——unsigned int (6)-(3)=3

    if (strlen("abc") - strlen("abcdef") >= 0)
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0;
}


http://www.ppmy.cn/news/1136664.html

相关文章

SimpleDateFormat非线程安全及解决方法

【RAEDME】 SimpleDateFormat非线程安全&#xff0c;即在多线程环境下解析字符串为日期对象&#xff0c;或格式化日期为字符串时&#xff0c;会抛出异常&#xff1b;当然&#xff0c;这是一个老生常谈的问题&#xff1b; 本文参考了已有 SimpleDateFormat的分析文章&#xff…

Android12之H264、H265、H266视频编码标准总结(四十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

LCR 120.寻找文件副本

​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;LCR 120. 寻找文件副本 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 使用哈希集合判断是否有元素重复出现即可。 解题代码&#xff1a; class Solution {public int findRepeatDocument(…

抖音小店怎么开通?都需要什么东西?这些你一定要知道!

我是电商珠珠 抖音小店怎么开通&#xff0c;都需要什么东西/条件&#xff1f; 我将这些详细的给大家罗列了出来&#xff0c;这些你一定要知道&#xff01; 抖音小店需要准备什么东西&#xff1f; 1、营业执照 个体工营业执照与企业工的权重一样&#xff0c;所以对于新手而…

网工方向基本常识(持续更新)

1. 设备分为带内管理和带外管理。 带内管理通过业务口管理设备&#xff0c;带外管理通过管理口管理设备。 接口类型一般设备都可以自定义接口类型。 一般而言带外管理使用私有地址管理&#xff0c;最多的就是192.168.0.1 。 连接该管理口后更改自己电脑的网卡地址为管理网段的…

阿里云ECS和轻量服务器有什么区别?

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;轻量和ECS优缺点对比&#xff0c;云服务器ECS是明星级云产品&#xff0c;适合企业专业级的使用场景&#xff0c;轻量应用服务器是在ECS的基础上推出的轻量级云服务器&#xff0c;适合个人开发者单机应用访问量不高的网站…

【多线程编程】创建线程的几种方式 面试题

创建线程的几种方法 继承Thread类&#xff0c;重写run方法。实现Runnable接口&#xff0c;重写run方法 。Thread匿名内部类&#xff0c;重写run方法。Runnable匿名内部类&#xff0c;重写run方法。Threadlambda表达式&#xff0c;不用重写。 1.继承Thread类&#xff0c;重写ru…

OpenGLES:绘制一个混色旋转的3D圆锥

效果展示&#xff1a; 本篇博文总共会实现两种混色旋转的3D圆锥&#xff1a; 一.圆锥解析 1.1 对圆锥的拆解 上一篇博文讲解了绘制圆柱体&#xff0c;这一篇讲解绘制一个彩色旋转的圆锥 在绘制圆柱体时提到过&#xff0c;关键点是先将圆柱进行拆解&#xff0c;便于创建出顶…