mirror of
https://github.com/Aexiar/c.git
synced 2024-10-22 14:05:45 +02:00
c
This commit is contained in:
parent
3d06ea64d9
commit
1b8e6cf0f3
@ -1332,7 +1332,7 @@ int b = -10;
|
||||
|
||||
![](./assets/43.svg)
|
||||
|
||||
* 但是,对于`无符号位`的整数而言,是`没有`符号位和数据位,即:没有原码、反码、补码的概念。无符号位的整数的数值都是直接使用二进制来表示的(也可以理解为对于无符号位的整数而言,计算机底层存储的就是其原码),如下所示:
|
||||
* 但是,对于`无符号位`的整数而言,是`没有`符号位和数据位,即:没有原码、反码、补码的概念。无符号位的整数的数值都是直接使用二进制来表示的(也可以理解为,对于无符号位的整数,计算机底层存储的就是其原码),如下所示:
|
||||
|
||||
```c
|
||||
unsigned int a = 10;
|
||||
@ -1373,10 +1373,11 @@ int main() {
|
||||
}
|
||||
```
|
||||
|
||||
* 其实,C 语言的底层逻辑很简单,C 语言压根不关心你定义的是有符号数还是无符号数,它只关心内存(如果定义的是有符号数,那就按照有符号数的规则来存储;如果定义的是无符号数,那就按照无符号数的规则来存储)。换言之,有符号数可以按照无符号数来输出,无符号数也可以按照有符号数来输出,至于输出结果对不对,那是程序员的事情,和 C 语言没有任何关系。
|
||||
* 其实,C 语言的底层逻辑很简单,C 语言压根不关心你定义的是有符号数还是无符号数,它只关心内存(如果定义的是有符号数,那就按照有符号数的规则来存储;如果定义的是无符号数,那就按照无符号数的规则来存储)。换言之,有符号数可以按照无符号数的规则来输出,无符号数也可以按照有符号数的规则来输出,至于输出结果对不对,那是程序员的事情,和 C 语言没有任何关系。
|
||||
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> * ① 正因为上述的原因,很多现代化的编程语言,如:Java 等,直接取消了无符号的概念。
|
||||
> * ② 对于 `1000 0000 …… 0000 0000` 是个特殊的补码,无法按照上述的方法转换为原码,所以计算机直接规定这个补码对应的值就是 `-2³¹`,至于为什么,下节我们会详细分析。
|
||||
> * ① 实际开发中,`printf` 函数中的常量、变量或表达式,需要和格式占位符一一对应;否则,将会出现数据错误的现象。
|
||||
> * ② 正因为上述的原因,很多现代化的编程语言,如:Java 等,直接取消了无符号的概念。但是,很多数据库是使用 C 语言开发的,如:MySQL 等,就提供了创建数据表的字段为无符号类型的功能,即:`UNSIGNED`(正整数) ,不要感觉困惑!!!
|
||||
> * ③ 对于 `1000 0000 …… 0000 0000` 这个特殊的补码,无法按照上述的方法转换为原码,所以计算机直接规定这个补码对应的值就是 `-2³¹`,至于为什么,下节我们会详细分析。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user