2010-01-20 89 views
6

Sử dụng scanf, mỗi số gõ vào, tôi muốn chương trình của tôi để in ra hai dòng: ví dụchuyển đổi int nổi để hex

byte order: little-endian 

> 2 
    2 0x00000002 
    2.00 0x40000000 

> -2 
    -2 0xFFFFFFFE 
-2.00 0xC0000000 

tôi có thể lấy nó để in ra 2 trong hex nhưng tôi cũng cần một phao và tất nhiên tôi không thể scanf như một khi tôi cần phải quét như một int

Nếu tôi cast như một phao khi tôi cố gắng printf tôi nhận được một số không. Nếu tôi quét như một phao tôi có được kết quả chính xác. Tôi đã cố gắng chuyển đổi int sang một float nhưng nó vẫn đi ra như số không.

đây là đầu ra của tôi cho đến nay

Int - float - hex 

byte order: little-endian 

>2 

     2 0x000002 
     2.00 00000000 

nó trông giống như tôi đang chuyển đổi sang một phao tốt tại sao sẽ không nó in như một hex? nếu tôi quét trong như một phao tôi nhận được đại diện hex chính xác như ví dụ đầu tiên. điều này phải là một cái gì đó đơn giản. tôi cần phải quét trong khi một số thập phân ghi nhớ tôi đang chạy này trong Cygwin

đây là những gì tôi có cho đến nay ..

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 


int HexNumber; 
    float convert; 
printf("Int - float - hex\n"); 



int a = 0x12345678; 
unsigned char *c = (unsigned char*)(&a); 
if (*c == 0x78) 
{ 
    printf("\nbyte order: little-endian\n"); 
} 
else 
{ 
    printf("\nbyte order: big-endian\n"); 
} 

printf("\n>"); 
scanf("%d", &HexNumber); 
printf("\n%10d ",HexNumber); 
printf("%#08x",HexNumber); 





convert = (float)HexNumber; // converts but prints a zero 

printf("\n%10.2f ", convert); 
printf("%#08x", convert); // prints zeros 


return 0; 
} 
+0

Bạn có thể vui lòng cho chúng tôi biết một số mã không? –

+0

xin lỗi. được đăng – Steller

+0

Không in số không cho tôi khi tôi nhập 1 làm đầu vào. Bạn đang cố gắng đạt được điều gì? Số đầu vào của bạn là gì? –

Trả lời

8

thử điều này:

int i = 2; 
float f = (float)i; 
printf("%#08X", *((int*) &f)); 

[EDIT]

@Corey:

hãy phân tích cú pháp từ trong ra ngoài:

& f = address of f = say address 0x5ca1ab1e 
(int*) &f = interpret the address 0x5ca1ab1e as integer pointer 
* ((int*)&f) = get the integer at address 0x5ca1ab1e 

sau đây là chính xác hơn, nhưng thật khó để nhớ associativity điều hành ngôn ngữ C và khai thác được ưu tiên (i thích rõ ràng thêm một số ngoặc thêm và khoảng trắng cung cấp):

printf("%#08X", *(int*)&f); 
+0

có vẻ như tôi đã chỉnh sửa câu trả lời của tôi để bao gồm cùng một điều cùng một lúc. – Trent

+0

hoạt động cảm ơn bạn – Steller

+0

đừng quên nhấp vào dấu kiểm, cảm ơn ;-) –

4
printf("%#08x", convert); // prints zeros 

Dòng này sẽ không làm việc bởi vì bạn đang nói với printf rằng bạn đang chuyển vào một số int (bằng cách sử dụng số %x) nhưng bạn đang truyền nó trong một số float.

Ý định của bạn với dòng này là gì? Để hiển thị biểu diễn nhị phân của số dấu chấm động trong hex? Nếu vậy, bạn có thể muốn thử một cái gì đó như thế này:

printf("%lx\n", *(unsigned long *)(&convert)); 

gì dòng này đang làm là lấy địa chỉ của chuyển đổi (&convert) mà là một con trỏ đến một phao và đúc nó thành một con trỏ đến một unsigned long (lưu ý: loại bạn đúc vào đây có thể khác nhau tùy thuộc vào kích thước của phao và dài trên hệ thống của bạn).Cuối cùng * được dereferencing con trỏ đến một unsigned dài thành một unsigned long được truyền cho printf

+0

Cảm ơn bạn đã giải thích về những gì bạn đã làm. Rất hữu ích – Steller

+0

Tôi tò mò làm thế nào tôi có thể làm cho nó để định dạng như thế này: 0xFFFFFFFE thay vì 0xffffffe. - nếu tôi sử dụng chữ hoa X của nó giống như 0XFFFFFFFE tôi cần x nhỏ và phần còn lại lớn .. – Steller

+1

@Corey sử dụng "0x% 08X" thay vì "% # 08X" – Trent

1

Với một int x, chuyển sang phao, sau đó in ra các byte của chúng trôi nổi trong hex có thể được thực hiện một cái gì đó như thế này:

show_as_float(int x) { 
    float xx = x; 

    //Edit: note that this really prints the value as a double. 
    printf("%f\t", xx); 

    unsigned char *ptr = (unsigned char *)&xx; 

    for (i=0; i<sizeof(float); i++) 
     printf("%2.2x", ptr[i]); 
} 

các tiêu chuẩn (C++ và C99) cho "kỳ đặc biệt" cho unsigned char, vì vậy nó là an toàn để sử dụng chúng để xem byte của bất kỳ đối tượng nào. C89/90 không đảm bảo điều đó, nhưng dù sao nó cũng hợp lý.

Các vấn đề liên quan