相关疑难解决方法(0)

c编译器如何处理无符号和有符号整数?为什么无符号和有符号算术运算的汇编代码是相同的?

我正在读这本书:CS-APPe2.C具有unsigned和signed int类型,并且在大多数体系结构中使用二进制补码算法来实现有符号值; 但在学习了一些汇编代码后,我发现很少有指令区分无符号和有符号.所以我的问题是:

  1. 编译器是否有责任区分已签名和未签名?如果是的话,它是如何做到的?

  2. 谁实现了二进制补码算法 - CPU或编译器?

添加更多信息:

在学习了一些更多的指令之后,实际上有一些指令区分了有符号和无符号,例如setg,seta等.此外,CF和OF分别适用于无符号和.但大多数整数算术指令对待无符号并且签名相同,例如

int s = a + b
Run Code Online (Sandbox Code Playgroud)

unsigned s = a + b
Run Code Online (Sandbox Code Playgroud)

生成相同的指令.

那么在执行时ADD s d,CPU是否应该对s&d进行未签名或签名?或者它是无关紧要的,因为两个结果的位模式是相同的,编译器的任务是将基础位模式结果转换为unsigned或signed?

PS我正在使用x86和gcc

c assembly

11
推荐指数
2
解决办法
3268
查看次数

标签 统计

assembly ×1

c ×1