Matlab:为什么 '1' + 1 == 50?

5

Matlab的动态类型较弱,这就是导致这种奇怪行为的原因。我不明白的是具体发生了什么,因为这个结果真的让我很惊讶。

编辑:为了澄清,我描述的明显是Matlab在ASCII格式中存储字符所导致的结果,这也在评论中提到过。我更感兴趣的是Matlab如何处理它的变量,特别是何时以及如何为值分配类型/标签。

谢谢。


'1' 

在Matlab中,1x1矩阵是由字符组成的。

'123' 

这是一个由3个字符组成的1行3列的矩阵。

正如预期的那样,

1

返回一个1x1的双精度数。


现在如果我输入

'1' + 1

我得到的是一个1-by-1的双精度数值,值为50。如果我输入
'123' + 1

我得到了一个1x3的双精度数组

[ 50 51 52 ]

此外,如果我输入

'a' + 1

结果是

98

在一个1x1的双精度中。

我猜这与Matlab如何以ASCII形式存储char变量有关,但它究竟是如何处理的呢?数据实际上是单类型和标记的,还是有其他的处理方式?

谢谢。


10
猜测:字符'1'的ASCII码为49。49 + 1等于50。 - Martijn Pieters
2
你为什么不在Stack Overflow上提问呢?http://meta.stackexchange.com/a/129632/165773 - gnat
我了解ASCII编码,但更好奇的是Matlab如何处理变量。这是一种语言设计问题,而不是具体的编程问题,这就是为什么我在这里提问的原因。 - zuiqo
5
听起来这个问题与Matlab及其操作方式有关,属于技术问题。这就是为什么Stack Overflow会出现的原因。如果该问题涉及到多种编程语言共同具备的一般性特征,那么它可能更适合在P.SE(Programmers Stack Exchange)上讨论。 - Panzercrisis
@Panzercrisis 谢谢,我明白了。 - zuiqo
2个回答

6
在MATLAB中,字符串只是ASCII字符的向量。你可以在 wikipedia 上了解更多关于ASCII码的知识。
当你混合使用字符和双精度数字时,MATLAB会将字符转换为其对应的ASCII码,并返回结果。因此,'1' 变成了 4949 + 1 = 50
当你写 '123' + 1 时,它变成了 [49 50 51] + 1,而MATLAB会正确地计算出结果为 [50 51 52],因为标量数加上矢量的结果是使得标量数添加到每个矢量元素中。
最后,'a' 的整数值为97,所以这一切都可以正常工作。
编辑:
请注意,您可以使用MATLAB命令 str2double 将字符转换为其实际数字表示,如下所示:
str2double('1') + 1
str2double('123') + 1

你可以使用函数“char”将ASCII码转换为字符(或字符串),例如char(49)会变成'1'。你可以使用“abs”将ASCII转换为双精度浮点数,例如abs('1')会变成49。输入“help strings”以获取更多信息。 - Joe Serrano

3
评论者说的非常对:数字1在ASCII码中的代码是49。你可以在C语言中看到同样的行为:
printf("%d", '1' + 1);

你将会得到50。

使用class()函数可以查看变量的类型:

octave:1> a = '1'
a = 1
octave:2> b = 1
b =  1
octave:3> class(a)
ans = char
octave:4> class(b)
ans = double
octave:5> c = [1 2 3]
c =
   1   2   3

octave:6> class(c)
ans = double
octave:7> d = '123'
d = 123
octave:8> class(d)
ans = char

当你把两个值相加时,它会将字符转换为双精度浮点数,并给出结果。

octave:9> class(a + b)
ans = double

最后,您可以使用whos函数来提供有关情况的更多信息。
octave:10> whos
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        a           1x1                          1  char
        ans         1x6                          6  char
        b           1x1                          8  double
        c           1x3                         24  double
        d           1x3                          3  char

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接