2012-08-16 23 views
11

nếu tôi có đoạn mã sau:Con trỏ có trỏ tới LSB hoặc MSB không?

int i = 5; 
void * ptr = &i; 
printf("%p", ptr); 

Tôi sẽ nhận được các LSB địa chỉ của tôi, hoặc MSB?
Tác vụ có khác nhau giữa các nền tảng không?
Có sự khác biệt nào ở đây giữa C và C++ không?

+5

Đó là hành vi undefined ** **. Cách duy nhất để in 'ptr' là bằng'% p', hoặc bằng cách chuyển nó thành 'intptr_t' và sử dụng macro định dạng in theo. –

+1

Đó không phải là về tính cuối cùng? –

Trả lời

15

Cân nhắc kích thước int là 4 byte. Luôn &i sẽ cung cấp cho bạn địa chỉ đầu tiên của 4 byte đó.

Nếu kiến ​​trúc có ít kiểu cuối, thì địa chỉ thấp hơn sẽ có LSB như dưới đây.

 
     +------+------+------+------+ 
Address | 1000 | 1001 | 1002 | 1003 | 
     +------+------+------+------+ 
Value | 5 | 0 | 0 | 0 | 
     +------+------+------+------+ 

Nếu kiến ​​trúc là lớn nhất, thì địa chỉ thấp hơn sẽ có MSB như dưới đây.

 
     +------+------+------+------+ 
Address | 1000 | 1001 | 1002 | 1003 | 
     +------+------+------+------+ 
Value | 0 | 0 | 0 | 5 | 
     +------+------+------+------+ 

Vì vậy &i sẽ cho LSB địa chỉ của i nếu little endian hay nó sẽ cho MSB địa chỉ của i nếu về cuối lớn

Trong chế độ về cuối nhỏ hỗn hợp cũng có, hoặc ít hoặc về cuối lớn sẽ được chọn cho mỗi công việc tự động.

Dưới logic sẽ cho bạn biết endianess

int i = 5; 
void * ptr = &i; 
char * ch = (char *) ptr; 

printf("%p", ptr); 
if (5 == (*ch)) 
    printf("\nlittle endian\n"); 
else 
    printf("\nbig endian\n"); 

Hành vi này sẽ tương tự cho cả hai cc++

8

Tôi có nhận được địa chỉ LSB của i hoặc MSB không?

Đây là nền tảng phụ thuộc: nó sẽ được thấp nhất quyết byte, có thể là MSB hoặc LSB tuỳ theo của nền tảng của bạn endianness.

Mặc dù điều này không được viết trong các tiêu chuẩn trực tiếp, đây là những gì đang ngụ ý bởi phần 6.3.2.3.7:

Khi một con trỏ đến một đối tượng được chuyển đổi sang một con trỏ tới một kiểu nhân vật, kết quả trỏ đến byte địa chỉ thấp nhất của đối tượng.


nó sẽ đóng vai trò khác nhau giữa các nền tảng?


Có một sự khác biệt ở đây giữa C và C++?

Số: nó là nền tảng phụ thuộc ở cả C và C++

+0

Mặc dù tôi gần như chắc chắn điều này là chính xác - bạn có thể vui lòng cung cấp tài liệu tham khảo cho các khiếu nại này không? – amit

+0

@amit Tôi không tìm thấy xác nhận trực tiếp, nhưng tiêu chuẩn nói "byte địa chỉ thấp nhất" trong phần mà nó nói về việc chuyển đổi thành con trỏ 'char'. – dasblinkenlight

+0

Cảm ơn mọi nỗ lực của bạn. – amit

5

ptr lưu trữ các địa chỉ của byte khởi đầu của đối tượng số nguyên. Cho dù đây là nơi chứa byte nhiều nhất hoặc ít quan trọng nhất tùy thuộc vào nền tảng của bạn. Một số nền tảng kỳ lạ thậm chí sử dụng kết thúc hỗn hợp trong trường hợp đó nó sẽ không phải là MSB cũng như LSB.

Không có sự khác biệt giữa C và C++ ở khía cạnh đó.

8

Nó phụ thuộc vào độ cuối của nền tảng; nếu đó là một nền tảng nhỏ, bạn sẽ nhận được một con trỏ tới LSB, nếu đó là một nền tảng lớn, nó sẽ chỉ ra MSB. Thậm chí có một số plaforms hỗn hợp-endian, trong trường hợp đó Thiên Chúa có thể có lòng thương xót của linh hồn của bạn kiểm tra các tài liệu cụ thể của trình biên dịch của bạn/CPU.

Tuy nhiên, bạn có thể thực hiện một kiểm tra nhanh chóng trong thời gian chạy:

uint32_t i=0x01020304; 
char le[4]={4, 3, 2, 1}; 
char be[4]={1, 2, 3, 4}; 
if(memcmp(&i, le, 4)==0) 
    puts("Little endian"); 
else if(memcmp(&i, be, 4)==0) 
    puts("Big endian"); 
else 
    puts("Mixed endian"); 

Bằng cách này, để in con trỏ bạn phải sử dụng %p giữ chỗ, không %d.

+0

Hãy làm rõ sự nghi ngờ nhỏ của tôi. Theo kiến ​​thức của tôi, hệ thống cuối cùng hỗn hợp sẽ chọn một trong hai hoặc nhỏ endian cho mỗi nhiệm vụ. Xin vui lòng cho tôi biết whats việc sử dụng trường hợp khác trong porgram của bạn. Liệu sự hiểu biết của tôi về người kết thúc hỗn hợp có sai không? – rashok

+0

"Mixed endian" là một thuật ngữ catchall được sử dụng cho các kiến ​​trúc nơi thứ tự byte không phải là kinh điển lớn hoặc cuối nhỏ (kiểm tra wikipedia cho một số ví dụ); mã của tôi chỉ đơn giản là kiểm tra nếu đại diện bộ nhớ của số nguyên 32 bit đó khớp với số nguyên dự kiến ​​cho hệ thống lớn hoặc cuối nhỏ, nếu nó không khớp với nó không điều tra thêm và chỉ nói rằng đó là kết thúc hỗn hợp. –

3

Điểm của MSB cho VC++ 2010 và Digital Mars của tôi là gì. Nhưng nó liên quan đến endianness.

Câu trả lời của câu hỏi này cung cấp một số thông tin cho bạn: Detecting endianness programmatically in a C++ program.

Ở đây, người sử dụng "none" nói:

#define BIG_ENDIAN  0 
#define LITTLE_ENDIAN 1 
int TestByteOrder() 
{ 
    short int word = 0x0001; 
    char *byte = (char *) &word; 
    return(byte[0] ? LITTLE_ENDIAN : BIG_ENDIAN); 
} 

Điều này cho phép một số thông tin endianness

1

cũng tôi nhận được LSB địa chỉ của tôi, hoặc MSB?

Tùy thuộc vào máy và hệ điều hành. Trên các máy cuối lớn và hệ điều hành, bạn sẽ nhận được MSB và trên các máy cuối nhỏ và hệ điều hành, bạn sẽ nhận được LSB.

Windows luôn luôn là người dùng cuối. Tất cả (hầu hết?) Hương vị của Linux/Unix trên x86 là ít endian. Linux/Unix trên các máy Motorola là thiết bị đầu cuối lớn. Mac OS trên các máy x86 là một chút endian. Trên máy PowerPC, nó là thiết bị đầu cuối lớn.

hoạt động khác biệt giữa các nền tảng phải không? Có.

có sự khác biệt nào ở đây giữa c và C++ không? Có lẽ là không.