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

C 这个程序在大端和小端系统上都兼容吗?,c,endianness,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;

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

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);
}
void ReverseString(字符*字符串)
{
char*Begin=String;
char*End=String+strlen(String)-1;
char TempChar='\0';
while(开始<结束)
{
TempChar=*开始;
*开始=*结束;
*End=TempChar;
Begin++;
结束--;
}
printf(“%s”,字符串);
}
在Windows(小字节)上,DEVC++的工作原理非常完美。 但我突然怀疑它的效率。如果你看这一行:

while (Begin < End) 
while(开始<结束)
我正在比较开头和结尾的地址。这是正确的方法吗? 这段代码在MacOSX这样的高端操作系统上有效吗? 还是我想错了

我有我上面提到的几个疑问。
有人能澄清一下吗?

您的代码没有与结尾相关的问题。你比较两个指针的方式也没什么问题。简而言之,您的代码很好。

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

据我所知,endianness不会影响char*,因为每个字符都是一个字节,并形成一个字符数组。看看
这种效果将在多字节数据类型(如int)中看到。

据我所知,endianness不会影响char*,因为每个字符都是一个字节,并形成一个字符数组。看看
这种效果可以在多字节数据类型(如int)中看到。

只要您操作整个
类型T
对象(这就是您使用
类型T
作为
字符所做的),您就不会遇到endianness问题


例如,如果您试图在一个更大的类型(例如
int
)中操作单独的字节,您可能会遇到它们,但您不会这样做。这就是为什么endianness问题在您的代码中是不可能的。只要您操作整个
类型T
对象(这就是您使用
类型T
作为
字符所做的),您就不会遇到endianness问题


例如,如果您试图在一个更大的类型(例如
int
)中操作单独的字节,您可能会遇到它们,但您不会这样做。这就是为什么endianness问题在代码中是不可能的,period。

endianness定义为多字节原语类型中字节的重要性顺序。因此,如果您的
int
是big-endian,则表示内存中
int
的第一个字节(即地址最低的字节)包含
int
的最高有效位,依此类推至最后/最低有效位。这就是它的全部意思。当我们说一个系统是big-endian时,这通常意味着它的所有指针和算术类型都是big-endian,尽管存在一些奇怪的特殊情况。Endian属性不影响指针运算或比较,也不影响字符串在内存中的存储顺序

您的代码不使用任何多字节基元类型[*],因此endian属性是不相关的。通常,只有当您以某种方式访问此类对象的各个字节时(例如,通过将指针投射到
unsigned char*
、将内存写入文件或通过网络等),endian ness才会变得相关

假设打电话的人做了这样的事情:

int x = 0x00010203; // assuming sizeof(int) == 4 and CHAR_BIT == 8
ReverseString((char *)&x);
那么他们的代码将依赖于endian。在big-endian系统中,它们会向您传递一个空字符串,因为第一个字节是0,所以您的代码将保持
x
不变。在一个小的endian系统上,他们会给你传递一个三字节的字符串,因为前三个字节是
0x03
0x02
0x01
和第四个字节0,所以你的代码会变为
x


[*]好的,指针是多字节的,在OSX和几乎每个C实现上。但您不检查它们的存储表示形式,只将它们用作值,因此没有机会根据endianness的不同而改变行为。

endianness被定义为多字节原语类型中字节的重要性顺序。因此,如果您的
int
是big-endian,则表示内存中
int
的第一个字节(即地址最低的字节)包含
int
的最高有效位,依此类推至最后/最低有效位。这就是它的全部意思。当我们说一个系统是big-endian时,这通常意味着它的所有指针和算术类型都是big-endian,尽管存在一些奇怪的特殊情况。Endian属性不影响指针运算或比较,也不影响字符串在内存中的存储顺序

您的代码不使用任何多字节基元类型[*],因此endian属性是不相关的。通常,只有当您以某种方式访问此类对象的各个字节时(例如,通过将指针投射到
unsigned char*
、将内存写入文件或通过网络等),endian ness才会变得相关

假设打电话的人做了这样的事情:

int x = 0x00010203; // assuming sizeof(int) == 4 and CHAR_BIT == 8
ReverseString((char *)&x);
那么他们的代码将依赖于endian。在big-endian系统中,它们会向您传递一个空字符串,因为第一个字节是0,所以您的代码将保持
x
不变。在一个小的endian系统上,他们会给你传递一个三字节的字符串,因为前三个字节是
0x03
0x02
0x01
和第四个字节0,所以你的代码会变为
x


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

您能详细解释一下为什么您认为它是正确的吗?@Z