【新书推荐】3.5 char类型

本节必须掌握的知识点:

   示例十

   代码分析

   汇编解析

3.5.1 示例十

char类型是比较古怪的,int\short\long类型如果在使用时不指定signed还是unsigned时都默认是signed,但char不一样,编译器可以实现为带符号的,也可以实现不带符号的。说它是字符类型,但它可以存储【-128~127】或【0~255】之间的整数,其中0~127对应ASCII码字符。

char的取值范围如下表所示:

类型

存储大小

值范围

char

1字节

【-128~127】或【0~255】

signed char

1字节

【-128~127】

unsigned char

1字节

【0~255】

表3-7 char类型取值范围

示例代码十

/*

   输出char类型的值

*/

#include <stdio.h>

#include <stdlib.h>

int main(void)

{

    char c = 1;

    printf("c = %d\n", c);

    system("pause");

    return 0;

}

●输出结果:

c = 1

请按任意键继续. . .

3.5.2 代码分析

char c = 1;

char类型在VS编译器中的取值范围是-128~127。示例十中定义了char型变量c:

char c = 1;

       紧接着printf函数按整数型格式化说明符’%d’输出变量c。输出结果为c = 1。 

如果将printf函数的格式说明符改为’%c’,输出结果将变为:

这是整数值1对应的ASCII字符。

char c = 255;

’%c’输出结果将变为:

超出了ASCII字符的范围。

char c = EOF;

’%c’输出结果将变为:

EOF结束符的值为-1。VS中选中EOF,鼠标右键选择“速览定义”:

#define EOF    (-1)

3.5.3 汇编解析

汇编代码

;C标准库头文件和导入库

include vcIO.inc

.data      

chr  sbyte     1     ;sbyte等价于char类型

.const    

szMsg db "c = %c",0dh,0ah,0

.code     

start:

       invoke printf,offset szMsg,chr                  

       ;     

       invoke _getch

       ret                       

end start

●输出结果:

在MASM汇编器中,sbyte类型为8位有符号整型,等同于C语言中的char类型,取值范围为-128~127。

反汇编代码

        char c = 1;

00231838  mov         byte ptr [c],1  

    printf("c = %c\n", c);

0023183C  movsx       eax,byte ptr [c] 

00231840  push        eax 

00231841  push        offset string "c = %c\n" (0237B30h) 

00231846  call        _printf (023104Bh) 

0023184B  add         esp,8 

在反汇编代码中,char c = 1;翻译为汇编语句为:mov byte ptr [c],1,这里使用的是临时强制指定数据宽度为byte类型。

如果改为char c = 1;翻译为汇编语句为:mov byte ptr [c], 0FFh,编译器将-1转换为补码形式存储。

实验三十一:输出char类型占用的存储空间以及它的范围值

VS中新建项目3-5-2.c。需要引用limits.h标准库函数头文件。代码如下:

/*

   输出char类型占用的存储空间以及它的范围值

*/

#include <stdio.h>

#include <stdlib.h>

#include <limits.h>

int main(void)

{

    printf("char 存储大小 : %u byte\n", sizeof(char));

    printf("unsigned char 存储大小 : %u byte\n", sizeof(unsigned char));

    printf("the range of char: %d ~ %d\n", SCHAR_MIN, SCHAR_MAX);

    system("pause");

        return 0;

}

●输出结果:

char 存储大小 : 1 byte

unsigned char 存储大小 : 1 byte

the range of char: -128 ~ 127

请按任意键继续. . .

实验三十二:输出char类型字符及其ASCII

VS中新建项目3-5-3.c。需要引用limits.h标准库函数头文件。代码如下:

       /*

   输出char类型字符及其ASCII值

*/

#include <stdio.h>

#include <stdlib.h>

int main(void)

{

    char a = 'E';

    char b = 70;

    int c = 71;

    int d = 'H';

    printf("a=%c, a=%d\n", a, a);

    printf("b=%c, b=%d\n", b, b);

    printf("c=%c, c=%d\n", c, c);

    printf("d=%c, d=%d\n", d, d);

    system("pause");

    return 0;

}

●输出结果:

a=E, a=69

b=F, b=70

c=G, c=71

d=H, d=72

请按任意键继续. . .

●观察反汇编代码:

    char a = 'E';

000C1838  mov         byte ptr [a],45h 

    char b = 70;

000C183C  mov         byte ptr [b],46h 

    int c = 71;

000C1840  mov         dword ptr [c],47h 

    int d = 'H';

000C1847  mov         dword ptr [d],48h

结论:char类型变量在内存中存储的都是-128~127之间的整数值。

练习

  1. 请读者将3-5-3.c翻译成汇编语言实现。
  2. 请读者分析3-5-3.c的反汇编代码。

实验三十三:判断char类型有无符号

VS中新建项目3-5-4.c。代码如下:

/*

   判断char类型有无符号

*/

#include <stdio.h>

#include <stdlib.h>

#include <limits.h>

int main(void)

{

    puts("这个编译器中的char型是:");   //有符号的

    if (CHAR_MIN)

    {

        puts("有符号的。"); //不为0,

    }

    else

    {

        puts("无符号的。");

    }

    system("pause");

    return 0;

}

●输出结果:

这个编译器中的char型是:

有符号的。

请按任意键继续. . .

 

结论

1.char型是用来保存“字符”的数据类型。

2.对于没有声明signed还是unsigned的char型,视为有符号类型还是无符号类型,视编译器而定。

3.注意:'c'和'\n'等字符常量为int型。不是char型。

练习

  1. 请读者将3-5-4.c翻译成汇编语言实现。

请读者分析3-5-4.c的反汇编代码。

本文摘自编程达人系列教材《汇编的角度——C语言》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/649928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink实现数据写入MySQL

先准备一个文件里面数据有&#xff1a; a, 1547718199, 1000000 b, 1547718200, 1000000 c, 1547718201, 1000000 d, 1547718202, 1000000 e, 1547718203, 1000000 f, 1547718204, 1000000 g, 1547718205, 1000000 h, 1547718210, 1000000 i, 1547718210, 1000000 j, 154771821…

【QT】文件目录操作

目录 1 文件目录操作相关的类 2 实例概述 2.1 实例功能 2.2 信号发射者信息的获取 3 QCoreApplication类 4 QFile类 5 QFilelnfo类 6 QDir类 7 QTemporaryDir和QTemporaryFiIe 8 QFiIeSystemWatcher类 文件的读写是很多应用程序具有的功能&#xff0c;甚至某些应用程序就是围绕…

内存管理(mmu)/内存分配原理/多级页表

1.为什么要做内存管理&#xff1f; 随着进程对内存需求的扩大&#xff0c;和同时调度的进程增加&#xff0c;内存是比较瓶颈的资源&#xff0c;如何更好的高效的利于存储资源是一个重要问题。 这个内存管理的需求也是慢慢发展而来&#xff0c;早期总线上的master是直接使用物…

Oracle篇—分区索引的重建和管理(第三篇,总共五篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

ES的一些名称和概念总结

概念 先看看ElasticSearch的整体架构&#xff1a; 一个 ES Index 在集群模式下&#xff0c;有多个 Node &#xff08;节点&#xff09;组成。每个节点就是 ES 的Instance (实例)。每个节点上会有多个 shard &#xff08;分片&#xff09;&#xff0c; P1 P2 是主分片, R1 R2…

达梦数据库——记录一次离谱的登录失败报错

好久没更新了哇 前面有整理过一些常见的数据库登录失败问题哈&#xff0c;今天记录一个遇到概率比较小&#xff0c;但碰上了一般不太容易找到原因的登录失败问题。 今天给客户同时初始化了三台服务器数据库&#xff0c;惟独这一台死活登不进去&#xff0c;满脑子问号&#xf…

【论文解读】Object Goal Navigation usingGoal-Oriented Semantic Exploration

论文&#xff1a;https://devendrachaplot.github.io/papers/semantic-exploration.pdf 代码&#xff1a;https://github.com/devendrachaplot/Object-Goal-Navigation 项目&#xff1a; Object Goal Navigation using Goal-Oriented Semantic Exploration example&#xff1…

2、鼠标事件、键盘事件、浏览器事件、监听事件、冒泡事件、默认事件、属性操作

一、鼠标事件 1、单击事件&#xff1a;onclick <body><header id"head">我是头部标签</header> </body> <script> var head document.getElementById("head")head.onclick function () {console.log("我是鼠标单击…

金蝶云星空--写插件不重启IIS热更新简单配置指南

云星空7.5版本&#xff0c;以简单方式配置并测试了热更新的实现方式可行&#xff0c;操作如下&#xff08;7.5外版本没试过&#xff0c;大家可试下&#xff09;&#xff1a; 1、打开WebSite\App_Data\Common.config&#xff0c;修改appSettings&#xff0c;设置IsEnablePlugIn…

go slice 扩容实现

基于 Go 1.19。 go 的切片我们都知道可以自动地进行扩容&#xff0c;具体来说就是在切片的容量容纳不下新的元素的时候&#xff0c; 底层会帮我们为切片的底层数组分配更大的内存空间&#xff0c;然后把旧的切片的底层数组指针指向新的内存中&#xff1a; 目前网上一些关于扩容…

redis源码之:clion搭建cluster环境

cluster集群通常每个node节点都是一主N从的模式&#xff0c;此处为简化环境搭建&#xff0c;所有node节点均只有一个主节点。 在clion环境中&#xff0c;为方便debug&#xff0c;需要通过配置多个cmake application实现redis-server、redis-cli等源码debug模式启动。 一、配置…

费曼学习法 - 理工科的学习利器

费曼学习法是以物理学家理查德费曼&#xff08;Richard Feynman&#xff09;命名的一种高效的学习方法。它旨在帮助你深入理解复杂概念&#xff0c;并能够用简单的语言解释它们。费曼学习法是一个学习框架&#xff0c;能够帮你对给定主题进行深入理解&#xff0c;包含以下4个简…

HTML-表单

表单 概念&#xff1a;一个包含交互的区域&#xff0c;用于收集用户提供的数据。 1.基本结构 示例代码&#xff1a; <form action"https://www.baidu.com/s" target"_blank" method"get"><input type"text" name"wd&q…

完成NAT实验

实验要求&#xff1a; 步骤一&#xff1a;配置vlan vlan b 2 3 interface GigabitEthernet 0/0/2 port link-type access port default vlan 2 interface GigabitEthernet 0/0/3 port link-type access port default vlan 3 interface GigabitEthernet 0/0/1 port link-type…

【PyTorch】使用PyTorch创建卷积神经网络并在CIFAR-10数据集上进行分类

前言 在深度学习的世界中&#xff0c;图像分类任务是一个经典的问题&#xff0c;它涉及到识别给定图像中的对象类别。CIFAR-10数据集是一个常用的基准数据集&#xff0c;包含了10个类别的60000张32x32彩色图像。在本博客中&#xff0c;我们将探讨如何使用PyTorch框架创建一个简…

C#,打印漂亮杨辉三角形(帕斯卡三角形)的源代码

杨辉 Blaise Pascal 这是某些程序员看完会哭的代码。 杨辉三角形&#xff08;Yanghui Triangle&#xff09;&#xff0c;是一种序列数值的三角形几何排列&#xff0c;最早出现于南宋数学家杨辉1261年所著的《详解九章算法》一书。 欧洲学者&#xff0c;最先由帕斯卡&#x…

Windows打开IE浏览器命令最简单的方法

问题场景&#xff1a; 许多插件或特定版本的系统需要使用ie浏览器来访问&#xff0c;window默认的ie浏览器是被禁用的如何快速打开ie浏览器解决问题 目录 问题场景&#xff1a; 测试环境&#xff1a; 检查环境是否支持&#xff1a; 问题解决&#xff1a; 方法一 方法二 方法…

03 SB实战 -微头条之首页门户模块(跳转某页面自动展示所有信息+根据hid查询文章全文并用乐观锁修改阅读量)

1.1 自动展示所有信息 需求描述: 进入新闻首页portal/findAllType, 自动返回所有栏目名称和id 接口描述 url地址&#xff1a;portal/findAllTypes 请求方式&#xff1a;get 请求参数&#xff1a;无 响应数据&#xff1a; 成功 {"code":"200","mes…

hex 尽然可以 设置透明度,透明度参数对比图 已解决

还不知道CSS Color Module Level 4标准早在2014年就推出8位hex和4位hex来支持设置alpha值&#xff0c;以实现hex和rgba的互转。这个办法可比6位HEX转RGBA简洁多了&#xff0c;先来简单解释一下&#xff1a; 8位hex是在6位hex基础上加后两位来表示alpha值&#xff0c;00表示完全…

Hadoop-MapReduce-MRAppMaster启动篇

一、源码下载 下面是hadoop官方源码下载地址&#xff0c;我下载的是hadoop-3.2.4&#xff0c;那就一起来看下吧 Index of /dist/hadoop/core 二、上下文 在上一篇<Hadoop-MapReduce-源码跟读-客户端篇>中已经将到&#xff1a;作业提交到ResourceManager&#xff0c;那…