【新书推荐】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,一经查实,立即删除!

相关文章

洛谷B3621枚举元组

枚举元组 题目描述 n n n 元组是指由 n n n 个元素组成的序列。例如 ( 1 , 1 , 2 ) (1,1,2) (1,1,2) 是一个三元组、 ( 233 , 254 , 277 , 123 ) (233,254,277,123) (233,254,277,123) 是一个四元组。 给定 n n n 和 k k k&#xff0c;请按字典序输出全体 n n n 元组&am…

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;甚至某些应用程序就是围绕…

C语言赋值表达式中什么是左值和右值?数组名作为左右值时又具有怎样的意义?

一、问题 赋值表达式中可以分为左值和右值&#xff0c;那么什么是左值和右值&#xff1f;数组名做为左右值时又具有怎样的意义&#xff1f; 二、解答 在C语言中&#xff0c;左值和右值的概念对于理解赋值表达式以及程序的正确性非常重要&#xff1a; 1、左值 • 左值是一个…

内存管理(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…

代码随想录算法训练60 | 单调栈part03

84.柱状图中最大的矩形 代码随想录 今天是训练营最后一天&#xff0c;恭喜坚持两个月的录友们&#xff0c;接下来可以写一篇自己 代码随想录一刷的总结。好好回顾一下&#xff0c;这两个月自己的博客内容&#xff0c;以及自己的收获。

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; 目前网上一些关于扩容…

ElasticSearch 开发总结(九)——SearchType:DFS_QUERY_THEN_FETCH和QUERY_THEN_FETCH

ElasticSearch 开发总结&#xff08;九&#xff09;——SearchType&#xff1a;DFS_QUERY_THEN_FETCH和QUERY_THEN_FETCH-CSDN博客 1.SearchType ES的搜索类型 有一个类SearchType&#xff08;如下图示&#xff09;&#xff0c;关于该类的描述&#xff1a; Search type repre…

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个简…

【算法专题】动态规划之子序列问题

动态规划5.0 动态规划 - - - 子序列问题&#xff08;数组中不连续的一段&#xff09;1. 最长递增子序列2. 摆动序列3. 最长递增子序列的个数4. 最长数对链5. 最长定差子序列6. 最长的斐波那契子序列的长度7. 最长等差数列8. 等差数列划分Ⅱ - 子序列 动态规划 - - - 子序列问题…

HTML-表单

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

宝塔部署 dvadmin3项目笔记

django-vue3-admin项目是一个优秀的基于Python和vue3的后端框架&#xff0c;可以在此基础上快速进行二次开发&#xff0c;目的是学习&#xff0c;记录通过宝塔部署该项目的一个步骤。 一、项目官网地址&#xff1a;dvadmin3 | Django-vue3-admin ​​​​​​ …

完成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…