【发布时间】:2021-07-30 22:35:41
【问题描述】:
我正在看书:CS-APPe2。 C 具有无符号和有符号 int 类型,并且在大多数体系结构中使用二进制补码算法来实现有符号值;但是在学习了一些汇编代码之后,我发现很少有指令区分无符号和有符号。所以我的问题是:
编译器是否有责任区分有符号和 未签名?如果是,它是如何做到的?
谁实现了补码算法 - CPU 还是编译器?
添加更多信息:
在学习了一些指令之后,实际上有一些区分有符号和无符号的,例如setg,seta等。此外,CF 和 OF 分别适用于 unsigned 和。但是大多数整数算术指令对待无符号和有符号是一样的,例如
int s = a + b
和
unsigned s = a + b
生成相同的指令。
那么在执行ADD s d时,CPU应该把s&d处理成无符号还是有符号?还是不相关,因为两个结果的位模式相同,编译器的任务是将底层位模式结果转换为无符号或有符号?
PS 我正在使用 x86 和 gcc
【问题讨论】:
-
"C 有无符号和有符号 int 类型,并使用补码算法来实现有符号值。我们都知道。" - 你们都知道错误。 2 的补码很流行,但并不普遍。 C 标准允许实现对有符号整数使用 1 的补码或符号+幅度表示。
-
关于问题:1.是的,通过查看变量的类型并在必要时发出不同的程序集; 2. CPU。
-
低层中无符号数和有符号数之间的差异只有在此类数字被扩展或截断(sext/zext 操作等)时才会显现出来。 1 的补数的算法对于有符号和无符号是相同的。
-
除了SK-logic:看看除法和比较,你会发现有符号和无符号之间的区别。从 CPU 的角度来看,任何数据都只是一组位或字节。
-
@SK-logic:答案多于评论——我建议你这样发布——尤其是如果你能想出一些可行的例子。