“有符号数和无符号数“学习笔记

**

"有符号数和无符号数"学习笔记

**

缘由

学习《计算机系统基础》关于有符号数和无符号数的章节后,对于老师举的例子还不是很清楚,就想着把一些东西记录下来,以便以后复习时使用
参考了CSDN上某位博主的文章和中国大学MOOC上袁春风老师的课程,链接如下:
CSDN博主文章:https://blog.csdn.net/daiyutage/article/details/8575248
袁春风老师MOOC:https://www.icourse163.org/learn/NJU-1001625001?tid=1460891441#/learn/content?type=detail&id=1237325733&cid=1257246654

基本概念

1、计算机内部数据按照“补码”形式存储,以减少“原码”和“反码”本身存在的部分问题【详见CSDN博主的文章】
2、计算机内部数据比较大小,若同时存在“有符号数”(普通int,char,long long)和“无符号数”(有unsigned符号:unsigned int ,unsigned char, unsigned long long),则c语言编译器强制将“带符号整数”转换为“无符号整数”,从而进行后序比较
3、负数的补码:通过对负数原码除符号位外的数值位按位取反(得到反码),后进行“+1”运算,得到补码
eg:-123:
原码:1111 1011
反码:1000 0100
补码:1000 0101
*小贴士:原码变为补码:也可以看做(从右往左遇到的第一个“1”前面除符号位外各位取反)
[补码1111 1011变为1000 0101];
而补码变回原码:若补码第一个符号为"1",则为负数, 则除符号位外,数值各位取反,末位加1
[1000 0101 变为 1111 1011 ]
4、正数的原码、反码、补码均为其本身

MOOC重要PPT

在这里插入图片描述
逐条解析:
小提示:*“U”代表unsigned,即无符号数;通过int型,
1、存在有符号数(0)和无符号数(0U)时,由“##基本概念第二点”提到的将带符号的数转换为无符号数进行比较,结果两者相同
2、“-1“和”0”都是代表“有符号数”,所以通过比较两者补码可知,两者补码分别为【1111 1111B】和【0000 0000B】,由于第一位是符号位,所以-1<0
3、由于“0”后面有‘U’的记号,显示为无符号数,结合(1)中解释,将“-1”也看做‘无符号数’,从而与“0”进行相应比较,而无符号数“-1”的补码[1111 1111B]被机器解释为2^32-1,远大于0
4、先判断是“带符号数”,由于“2147483647”是2^31-1,被机器用补码形式记录为[Ox7FFF FFFF] (16进制表示),而“-2147483647-1”被机器用补码形式记录为[Ox8000 0001],根据有符号位数比较,第一个数大于第二个数
5、由于两者需要转化为’无符号数’进行比较,结合(4)可知,“2147483647”和“-2147483647-1”的16进制,则第一个数小于第二个数
6、由于“(int)2147483647U”先转为无符号类型,最终仍被强制转化为int型数据(带符号位),所以原式是两个带符号位的比较,由于“2147483648,即231”的无符号数表示为[1000……0B],被机器解释为32位带符号数时,其值为最小负数-2(32-1)=-2^31=-2147483648;而“2147483647”是正数,所以第一个大于第二个,
7、由于“-1”和“-2”都是带符号数的7、由于“-1”和“-2”都是带符号位的数据,所以结合二者负数的补码进行比较,可知-1>-2
8、和(7)不同,此处-1是(unsigned),即无符号数,由(1)知,两者需转化为无符号数进行比较,得到第一个数仍大于第二个数
小提示:比较下(2)(3)、(4)(5)、(7)(8),三者都是前者带符号位,后者不带符号位,结果出现了大小上的不同!

测试代码运行

// C语言代码
int x=-1;
unsigned u=2147483647;
printf("x = %u = %d\n",x,x");
printf("u = %u = %d\n",u,u");

//输出结果:
x = 4294967295 = -1
u = 2147483647 = 2147483647

//c语言代码
int x=-1;
unsigned u=2147483648;
printf("x = %u = %d\n",x,x");
printf("u = %u = %d\n",u,u");

//输出结果
x = 4294967295 = -1
u = 2147483648 = -2147483648

运行代码出现的结果你还没搞懂 还有前面“##重要PPT”下面第六小题为何被机器解释为32位带符号数时,其值为最小负数-2(32-1)=-231=-2147483648,需要后续进行思考了。

参考资料

CSDN博客:https://blog.csdn.net/daiyutage/article/details/8575248
中国大学MOOC教材:https://www.icourse163.org/learn/NJU-1001625001?tid=1460891441#/learn/content?type=detail&id=1237325733&cid=1257246654

在Verilog中,有符号的加法可以通过使用`+`操作符来实现。在Verilog代码中,可以使用`signed`关键字来声明有符号变量。例如,如果要实现一个有符号加法器,可以定义两个有符号输入`a`和`b`,然后使用`+`操作符将它们相加并将结果赋给一个有符号输出变量`sum`。下面是一个简单的Verilog代码示例: ```verilog module signed_adder( input signed [7:0 a, input signed [7:0 b, output reg signed [8:0 sum ); always @(a or b) begin sum <= a + b; end endmodule ``` 在上面的例子中,`input signed [7:0] a`和`input signed [7:0] b`分别声明了两个有符号的8位输入变量`a`和`b`,`output reg signed [8:0] sum`声明了一个有符号的9位输出变量`sum`。`always @(a or b)`语句指定了当`a`或`b`发生变化时,执行计算和赋值操作。`sum <= a + b`语句将`a`和`b`相加的结果赋给`sum`变量。 请注意,Verilog中的有符号加法和无符号加法在语法上是相同的,但是对于有符号的处理需要注意溢出和符号位扩展等问题,以确保正确的计算结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Verilog学习笔记——有符号的乘法和加法](https://blog.csdn.net/DengFengLai123/article/details/104072423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [verilog有符号加法器设计](https://download.csdn.net/download/qq_42025108/16392840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [verilog中有符号无符号的相关运算](https://blog.csdn.net/qq_43140345/article/details/123806734)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

司_夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值