一个简单的c程序

news2024/11/24 6:37:49

        有些基础知识点如果不经常温故可能就会忘记,难道是因为我已经老了吗?人要是老了,脑子是真的不好用了啊。今天看一个很简单的c代码:

#include <stdio.h>
#include <stdlib.h>

typedef int eint32;
typedef unsigned int euint32;

int main()
{
        unsigned char a = 300;

        euint32 *p = &a;
        printf("a = %d, *p = %d\n", a, *p);
        if(a > 0)
        {
                printf("a > 0\n");
        }
        else
        {
                printf("a < 0\n");
        }
    
    return 0;
}

这个输出会是多少呢?

这里涉及到了两个知识点:char 类型的取值范围及指针类型。我们知道unsigned char的取值范围为0~255, 即0000 0000 ~ 1111 1111。从上面的编译警告也可以得到一些信息,如第1个警告说是a可能是被赋予的是截断后的值;而第2个是类型不匹配进行了赋值。a = 44是怎么来的呢?其实就是被截断后的值,因为 300 的二进制为 0001 0010 1100(前面的0就不列了),而 char 只占 8 位,所以只会把低 8 位赋给了 a (即0010 1100,其十进制就是44);而*p的值就不确定了,因为 p 是 unsigned int 类型,所以 *p 则会取 4 个字节的值(sizeof(unsigned int) = 4)。而 p 指向了 a,所以取的就是以 a 地址为起点的 4 个字节的值。用gdb跟踪如下:

 

a 地址里的值的二进制就是 00101100, 而十进制就是44;那当我们用 *p 取值的时候,就是以地址 0x7fffffffe347 为起点的4个字节的内容,如:

代码里用的 %d 为有符号的十进制进行输出形式,但我们从windows 的计算器上看这个二进制 对应的十进制为:

 

这也对应不上啊,同样的一个二进制不同的两个值。这是为什么呢?这里又涉及到原码、反码、补码的知识点了,有兴趣的可以看这篇 char 的取值范围 。 上面这样的二进制是错的,因为我使用的是机器是小端的存储方式。

 在计算器上的应该是这样的:

所以打印 *p 的值为  4293084972,但是程序中是以 %d 打印的,是有符号的,其结果为:

其结果为负数 -1882324。上面说过原码、反码、补码,那我们反过来,把上面的 4293084972 的二进制先减1为反码:

 

然后再将反码还原为原码,好符号位不变,其他所有位取反,得:

这里最高位为1表示负数,不包含最高位的值为:1882324

 

而加上符号位它就是 -1882324

总结:

补码:正数的补码等于它的原码;负数的补码等于反码+1 

从上面的输出我们也可以得出,如果是以无符号方式输出则其二进制是多少其值就是多少,而以有符号输出,因其最高位是 1,表示负数,则其二进制是以补码方式存储的,要输出其十进制则需要还原为原码。

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

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

相关文章

基于数据库实现乐观锁

基于数据库实现乐观锁 一 乐观锁与悲观锁介绍二 乐观锁实践案例2.1 库存超卖问题复现2.1.1 模拟秒杀下单分析2.1.2秒杀代码2.1.3单元测试结果 2.2 库存超卖问题分析2.3 乐观锁解决超卖问题2.3.1版本号方式 案例源码案例中sql脚本 一 乐观锁与悲观锁介绍 悲观锁&#xff1a; 悲…

Java的文件操作和IO

目录 一、认识文件 树型结构组织 和 目录 文件路径&#xff08;Path&#xff09; 其他知识 二、Java 中操作文件 File 概述 属性 构造方法 文件内容的读写 —— 数据流 InputStream 概述 FileInputStream 概述 构造方法 代码示例 利用 Scanner 进行字符读取 Out…

Puppeteer 部署 - Docker容器 - Idea一键部署

Puppeteer 代码注意 部署到服务器&#xff0c;报错 Running as root without --no-sandbox is not supported.解决方案&#xff1a; const browser await puppeteer.launch({args: [--no-sandbox],env: {DISPLAY: ":10.0"}});Dockerfile 编写Dockerfile根据自己…

前后端交互 | 传递参数的方式

目录 GET请求两种方式 第一种&#xff1a;&#xff1f;& 形式 第二种:不使用&#xff1f;或者引号进行 传递参数 POST请求 小结&#xff1a; get和post的使用情况 传参数重复 传参数&#xff1a;目前共有三种传递参数的方式 GET请求两种方式 第一种&#xff1a;&…

史上最全BI知识全解,万字长文带你读懂BI

在各种新趋势的影响下&#xff0c;数字化不仅在当下有着强大的实力以及巨大的潜力&#xff0c;更是成为了未来世界的标志&#xff0c;成为了社会各界对未来发展的共识。企业为了执行数字化战略&#xff0c;实行数字化转型&#xff0c;实现数据价值&#xff0c;除了需要相关数字…

cpp综合项目—机房预约系统

目录 1、机房预约系统需求 1.1、 身份简介 1.2、机房简介 1.3、申请简介 1.4、 系统具体需求 2、创建项目 3、创建主菜单 3.1 菜单实现 3.2、接口实现 4、退出功能实现 4.1、退出功能实现 4.2、测试退出 5、创建身份类 5.1、身份的基类 5.2、学生类 5.3、老师类…

windows重装后恢复谷歌浏览器数据(旧的用户数据仍存在user data)

背景及注意前提&#xff01;&#xff01;&#xff01; 首先基于我笔记本被公司电脑加域之后&#xff0c;原先家庭版还被升级成了专业版&#xff0c;但是旧的user用户数据还都存在。只是变成了两个用户&#xff0c;开机默认是加域后的用户。 如果你的C盘已经完全被重写了&…

shell计算天数差和月份差

计算月份差 monthdiff.sh function getMonthDiff() { date1${1//-/} date1_year${date1:0:4} date1_month${date1:4:2} date2${2//-/} date2_year${date2:0:4} date2_month${date2:4:2} diff$(((date1_year-date2_year)*12 (date1_month-date2_m…

目前国内有哪些开源的非 SaaS 团队协作平台、项目管理工具呢?

以下是一些常用的开源团队协作平台和项目管理工具&#xff1a; 1.Gitea Gitea 是一个轻量级的 Git 服务&#xff0c;它提供了一个基于 Web 的界面&#xff0c;以方便地管理 Git 存储库。Gitea 也是一个自托管的 Git 服务&#xff0c;可以轻松地在本地或云环境中部署。 2.GitL…

详细分析置换算法

对于操作系统而言&#xff0c;虚拟空间是非常大的&#xff0c;我们往往无法直接将如此大的空间装入内存&#xff0c;而即使我们采用多级页表与段页式存储即使&#xff0c;也仅仅只是节省了页表的大小&#xff0c;如此将如何多的物理页装进内存仍然是一个问题&#xff0c;为此科…

【2023年4月美赛加赛】Z题:The future of Olympics 25页完整论文

【2023年4月美赛加赛】Z题&#xff1a;The future of Olympics 25页完整论文 1 题目 背景 国际奥委会(IOC)正面临着夏季奥运会和冬季奥运会申办数量的减少**[1]**。在过去&#xff0c;举办奥运会的竞争非常激烈&#xff0c;声望也很高。然而&#xff0c;最近&#xff0c;主办…

MySQL基础篇——MySQL数据库 表的操作,

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.表操作 1.表操作-查询创建 1&#xff09;查询当前数据库所有表 2). 查看…

在ubuntu20.x上修改mysql密码

1&#xff0c;在安装mysql后测试mysql是否安装成功可链接数据测试输入一下命令命令都在终端中输入 mysql -u root -p 提示输入密码错误 输入命令后需要输入数据库密码&#xff0c;如忘记密码可进行数据库密码的修改 2&#xff0c;sudo cat /etc/mysql/debian.cnf 输入命令后…

MySQL2-多表查询、子查询、union、limit机制

一、多表查询 在实际开发中&#xff0c;大部分情况下都不是从单表中查询数据&#xff0c;一般都是多张表联合查询取出最终的结果。一般一个业务都会对应多张表。 1.表的连接方式的分类 内连接&#xff1a;等值连接、非等值连接、自连接 外连接&#xff1a;左外连接&#xff08;…

HTML+CSS实训——Day02——写一个登陆界面

前言 今天要继续完成我们的音乐软件了&#xff0c;昨天写完了封面&#xff0c;今天该完成开屏广告和登陆界面了。 登陆界面代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-C…

00后太卷了,老油条感叹真干不过...

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

Whatsns内容付费seo优化带采集和熊掌号运营问答系统

正文&#xff1a; 付费课程增加付费课程试听功能基础版和高级企业版&#xff0c;Plus版增加微信消息模板回答通知&#xff0c;采纳答案通知改进兼容因导入Discuz用户密码规则不兼容导致登录失败问题基础版和高级企业版&#xff0c;Plus版增加改进微信文本回复&#xff0c;支持…

【搭建服务器】Win10 IIS搭建webdav服务以及公网访问教程 - 挂载webdav

文章目录 1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表 4. 公网远程访问4.1 浏览器访问测试4.2 映射本地盘符访问4.3 安装Raidrive客户端 总结&#xff1a; 自己用W…

你真的会写测试用例吗?如何写?测试用例之中的细节拉满了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 测试用例中的细节…

进程间通信之system V共享内存

目录 &#x1f39e;一、共享内存---shm 1.1shmget ①ftok得到一个key ②shmget得到shm ③shm的性质 1.2 shmctl ①ipcrm ②shmctl 1.3shmat&&shmdt ①shmat ②shmdt 1.4通过shm完成进程间通信 1.5shm的特点 ①shm共享内存的优点 ②shm的缺点 1.6shm的内核…