是否有一种编程方式来检测您是否在大端或小端架构上?我需要能够编写将在Intel或PPC系统上执行的代码并使用完全相同的代码(即没有条件编译).
是否有一行宏定义来确定机器的字节顺序.我使用以下代码,但将其转换为宏将太长.
unsigned char test_endian( void )
{
int test_var = 1;
unsigned char test_endian* = (unsigned char*)&test_var;
return (test_endian[0] == NULL);
}
Run Code Online (Sandbox Code Playgroud) 由于是数字的不同二进制表示(例如,采取大/小端),这是跨平台:
// NOTE: FIXED-SIZE unsigned integral type
some_unsigned_type variable = some_number;
// set n-th bit, starting from 1,
// right-to-left (least significant-to most significant)
variable |= ( 1 << ( n - 1 ) );
// clear the same bit:
variable &= ~( 1 << ( n - 1 ) );
Run Code Online (Sandbox Code Playgroud)
换句话说,编译器是否总是处理固定大小的无符号数的不同二进制表示,或者它是特定于平台的?
如果variable是有符号整数类型(例如int),它的值是
什么是标准说这个?
PS和,是的,我在这两个很有趣的- C并且C++,请不要告诉我,他们在不同的语言,因为我知道这:)
如果需要,我可以粘贴真实的例子,但帖子会变得太长
我以为C中的整数首先存储了最高有效位,例如,数字5将是0...0101。我以为我可以通过强制C让我假装一个特定的内存地址是an,int然后像在那儿一样添加到这些位来操纵特定位int。
我试图在内存中设置0的0位,然后尝试将其添加255到不同的内存地址中,这似乎工作得好像最低有效位先于最高有效位存储在内存中,因为当我在内存地址中添加1并更改时我那里的位数更大,而不是较小。如果最高有效位较早地存储在内存中,那么将255高8位是next的开头,那么将其添加到比原地址高1个字节的内存地址根本不会影响该地址int。我想知道我是否正确地解释了这一点,并且整数首先以最低有效位存储。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main() {
int *x = malloc(8); //getting 4 memory addresses
int *y = malloc(8);
int *z = malloc(8);
int *a = malloc(8);
x[0] = 0; //setting 64 bits past memory addresses to 0s
x[1] = 0;
y[0] = 0;
y[1] = 0;
z[0] = 0;
z[1] = 0;
a[0] = 0;
a[1] = 0;
*((int*)((int)x)) = 255; …Run Code Online (Sandbox Code Playgroud)