主题:如何查询ASCⅡ码
davidxinger
[专家分:0] 发布于 2012-11-13 18:44:00
program main
implicit none
integer::a
a="A"
write(*,*)a
stop
end program main
!我觉得上述代码应该可以显示A的ASCⅡ码,但是不知道为什么显示的是 538976353
请问错在那里呢,不能用字符给整型变量赋值吗,应该怎么写这个函数呢?(不用ichar)
回复列表 (共2个回复)
沙发
臭石头雪球 [专家分:23030] 发布于 2012-11-14 10:24:00
有 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 不是很推荐使用。
板凳
davidxinger [专家分:0] 发布于 2012-11-14 17:01:00
这么耐心详细的回复,小白心里满满感动。
我不是孔兄啦,解决问题不是目的,其实是想学习失败的原因。你的回复实在让我受益颇多,但是还有一点不理解:
内存存储的不是二进制吗,只有1和0,怎么会有61 20 20 20呢?
我来回复