关于C语言类型转换的一个问题

plicqrtu  于 2022-12-26  发布在  其他
关注(0)|答案(2)|浏览(119)

如何理解C语言中字符'!'到int类型的转换就是从1字节33到4字节33的转换过程
我知道33是一个Ascill表值,但是为什么它们使用不同的存储空间,但是都是33呢?我很困惑

jdg4fx2g

jdg4fx2g1#

计算机上的二进制数有固定的位数。这意味着它们有前导零。没有前导零,33 = 132 + 016 + 08 + 04 + 02 + 11 =二进制100001无符号。
对于8位char类型,这是二进制00100001。
对于32位int类型,其为二进制0000000 0000000 00000000 00100001。
只要前导位为0,在添加或截断前导零时不会丢失或添加任何内容。如果需要接触1位,则更改值。
对于真实的世界中的10进制模拟,想象一下一个带按钮的机械步数计数器“响片”。所有的数字都在那里。或者想象一下一个数字钟,至少分钟总是有前导零,比如12:01而不是12:1。这与计算机相同,一个字节的所有位都在那里,在存储芯片中。
有符号整数稍微复杂一点,基本上负数的前导是1而不是0,所以如果你截断或扩展,只要最左边的位不变(负数必须是1,正数必须是0),就不会有任何变化。
如果你有100001的纸上数字(在普通的计算机中你永远不会只有6位,你至少有1个字节,在你可能使用的任何计算机中都是8位),并且知道它是有符号的,它实际上是负的,扩展到8位将是11100001。所以你必须“知道”二进制数是负的还是正的,从二进制数本身是看不出来的。

gijlo24d

gijlo24d2#

如何书写数字?试想一下,计算机使用固定长度的字段(如行政纸质表格中的字段)来表示数字。当计算机使用基数2表示时,就像在长度为2的字段中书写33,或者在长度为4或8的字段中书写33,等等。

| 3 | 3 |
| 0 | 0 | 3 | 3 |
| 0 | 0 | 0 | 0 | 0 | 0 | 3 | 3 |

同样的号码,不同的笔迹。
编程语言中的类型是事物的表示/存储(在内存中)和对它们的操作/运算符语义(使用机器指令)。
int基本上是一个类型,它表示带有算术运算符的常用(不太大)整数值。
char是一种类型,基本上是非常短的整数值,并具有从/到 *char literal *,input/output 的附加转换(ASCII)。

相关问题