这个程序在大端和小端系统上都兼容吗?

时间:2011-05-04 06:39:56

标签: c endianness

我写了一个小程序,它反转一个字符串并将其打印到屏幕上:

void ReverseString(char *String)
{
    char *Begin = String;
    char *End = String + strlen(String) - 1;
    char TempChar = '\0';

    while (Begin < End) 
    {
        TempChar = *Begin;
        *Begin = *End;
        *End = TempChar;
        Begin++;
        End--;
    }
    printf("%s",String);
}

它在Windows上的Dev C ++(小端)中完美运行。 但我突然怀疑它的效率。如果你看这一行:

while (Begin < End) 

我正在比较开头和结尾的地址。这是正确的方法吗? 此代码是否适用于Mac OS X等大端操作系统? 或者我的想法是错误的?

我有几个疑问,我在上面提到过。 有人可以澄清一下吗?

4 个答案:

答案 0 :(得分:6)

您的代码没有与字节顺序相关的问题。你比较两个指针的方式也没什么不对。简而言之,您的代码很好。

答案 1 :(得分:3)

字节顺序定义为多字节基本类型中字节的重要性顺序。因此,如果您的int是big-endian,那意味着内存中int的第一个字节(即地址最低的那个)包含int的最高有效位,并且所以到最后/最不重要。这意味着所有。当我们说一个系统是big-endian时,这通常意味着它的所有指针和算术类型都是big-endian,尽管那里有一些奇怪的特殊情况。 Endian-ness不影响指针算术或比较,也不影响字符串存储在内存中的顺序。

您的代码不使用任何多字节基元类型[*],因此endian-ness无关紧要。通常,如果以某种方式访问​​此类对象的各个字节(例如,通过将指针转换为unsigned char*,将内存写入文件或通过网络等),则字节序只会变得相关。

假设呼叫者做了类似这样的事情:

int x = 0x00010203; // assuming sizeof(int) == 4 and CHAR_BIT == 8
ReverseString((char *)&x);

然后他们的代码将依赖于字节序。在big-endian系统上,它们会传递一个空字符串,因为第一个字节是0,所以你的代码会保持x不变。在little-endian系统上,他们会传递一个三字节的字符串,因为前三个字节是0x030x020x01和第四个字节0​​,所以你的代码会将x更改为0x00030201

[*]好吧,指针是多字节的,在OSX和几乎每个C实现上都是如此。但是你没有检查他们的存储表示,你只是将它们用作值,因此根据字节顺序,行为没有机会不同。

答案 2 :(得分:1)

据我所知,endianness不会影响char *,因为每个字符都是单个字节并形成一个字符数组。看看http://www.ibm.com/developerworks/aix/library/au-endianc/index.html?ca=drs- 在多字节数据类型(如int)中可以看到效果。

答案 3 :(得分:1)

只要你操纵整个type T对象(这就是你对type T char所做的那样),你就不会遇到字节序问题。

如果你试图在较大的类型中操作单独的字节(例如int),你可能会遇到它们,但是你不做那样的事情。这就是为什么在你的代码中,字符串问题是不可能的。