一个简单的c程序

news/2025/3/18 15:28:44/

        有些基础知识点如果不经常温故可能就会忘记,难道是因为我已经老了吗?人要是老了,脑子是真的不好用了啊。今天看一个很简单的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.ppmy.cn/news/74492.html

相关文章

Python3 迭代器与生成器

在Python中&#xff0c;迭代器&#xff08;iterator&#xff09;和生成器&#xff08;generator&#xff09;是用于处理可迭代对象&#xff08;iterable&#xff09;的重要概念。它们提供了一种逐个访问元素的方式&#xff0c;而不需要提前将所有元素存储在内存中。 迭代器是一…

纵观人类发展史,我发现了一个秘密!

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 纵观人类的历史&#xff0c;就是工具化日益增强的历史。通过创新工具、解放生产力&#xff0c;人类从茹毛饮血到现在设计模型驾驭人工智能&#xff0c;一路从刀耕火种走到信息时代。 远古时期&#xff0c;人们偶…

VMwareESXI虚拟机黑群晖7.2 正式版 (懒人包)

版本说明&#xff1a; VMware Workstation 桌面版虚拟机&#xff0c;可下载VMware专用版本 VMware ESXi虚拟机&#xff0c;可以下载OVA版本 VMware Workstation桌面版虚拟机 使用教程&#xff1a; 1.下载VMware专用版本&#xff0c;然后进行解压&#xff0c;双击解压出来的&q…

自考本科哪个专业最简单 怎么选择专业

自学考试专业分为文科和理科两类&#xff0c;相对来说文科更好考一些&#xff0c;文科不涉及计算的题目&#xff0c;对于数学不好或者是基础差的同学来说比较友好。比如汉语言文学、工商管理、行政管理等专业比较容易通过。 自考本科哪个专业比较简单 自考本科比较容易通过的专…

递增数组的判断【python实现】

有时候需要对某一组数组的数据进行判断是否 递增 的场景&#xff0c;比如我在开发一些体育动作场景下&#xff0c;某些肢体动作是需要持续朝着垂直方向向上变化&#xff0c;那么z轴的值是会累增的。同理&#xff0c;逆向考虑&#xff0c;递减就是它的对立面。 下面是查找总结到…

常见 Web 安全攻防总结

Web 安全地对于 Web 从业人员来说是一个非常重要的课题&#xff0c;所以在这里总结一下 Web 相关的安全攻防知识&#xff0c;希望以后不要再踩雷&#xff0c;也希望对看到这篇文章的同学有所帮助。今天这边文章主要的内容就是分析几种常见的攻击的类型以及防御的方法。 也许你对…

C++ 求最大子序列和(贪心算法)

#include "iostream" #include "vector" using namespace std; class Solution { // 得到一个最大的负数&#xff0c;如果全部不是负数&#xff0c;就会返回一个最大的正数 int isAllLow(vector<int> &nums){ int maxnums[0]; for (int i 1; i …

分享一个我们团队新上线剪藏插件「妙剪藏」一键收藏网页,还可以做网盘使用

我们团队本周新上线了剪藏工具「妙剪藏」&#xff0c;可以将网页端和微信中的重要内容保存到你的工作空间&#xff1b;并且支持上传多类型文件&#xff0c;做 网盘 使用&#xff1b;增加 自定义标签系统&#xff0c;方便分类文件&#xff1b; 目前支持的剪藏方式: 浏览器插件…