回 帖 发 新 帖 刷新版面

主题:如何查询ASCⅡ码

program main

implicit none

integer::a


a="A"

write(*,*)a


stop

end program main


!我觉得上述代码应该可以显示A的ASCⅡ码,但是不知道为什么显示的是  538976353

请问错在那里呢,不能用字符给整型变量赋值吗,应该怎么写这个函数呢?(不用ichar)



回复列表 (共2个回复)

沙发

有 ichar 你为什么不用呢?

让我想起,茴香豆,有 4 种写法。呵呵,学东西不必那么刻板。

嗯,让我们分析一下为什么会是 538976353。

538976353,转换成十六进制,是 0x20202061。

在微机上,内存里这样存储:61 20 20 20

其中 61 对应十进制的 97,也就是 “A”的ASCII码。
后面 3 个 20 对应十进制 32 ,是空格的 ASCII 码。

你懂了吗?
a="A"
a 是 integer 变量,有 4 字节,而 “A”只有1字节,后面3个字节自动补了空格。于是变成了“A   ”
转换成十六进制是 61 20 20 20,再转换成整型,就是 0x20202061 = 538976353 了。

OK,懂了这样的话,就知道解决方案了。

第一种:
program main 
 implicit none 
 integer*1::a 
 a="a" 
 write(*,*)a 
end program main

但是 integer*1 不是所有编译器都识别。

第二种:
program main 
 implicit none 
 integer::a
 character( Len = 4 ) :: s
 EQUIVALENCE( a , s )
 a = 0
 s(1:1) = "a"
 write(*,*) a 
end program main

让 s 和 a 共享同一个内存,然后 a = 0,让 4 个字节都是 0
s(1:1) 让第一个字节成为 61,后面依然是 00 00 00
于是 a = 97
但是 equivlance 不是很推荐使用。

板凳

这么耐心详细的回复,小白心里满满感动。

我不是孔兄啦,解决问题不是目的,其实是想学习失败的原因。你的回复实在让我受益颇多,但是还有一点不理解:

内存存储的不是二进制吗,只有1和0,怎么会有61 20 20 20呢?

我来回复

您尚未登录,请登录后再回复。点此登录或注册