如何打印c中的内存位
我正在学习如何在内存中表示数字。 我想知道如何打印一些int和floatvariables的内存中的实际表示(二进制或hex)。
例如,我想看看在添加或减less数字时会发生什么情况。
如何访问内存并打印?
您需要将指向正在讨论的variables的指针分配给char *
,并将其视为长度为sizeof(variable)
的字节数组。 然后,您可以使用%X
格式说明符以hex打印每个字节到printf。
你可以像这样定义一个函数:
void print_bytes(void *ptr, int size) { unsigned char *p = ptr; int i; for (i=0; i<size; i++) { printf("%02hhX ", p[i]); } printf("\n"); }
并像这样调用它:
int x = 123456; double y = 3.14; print_bytes(&x, sizeof(x)); print_bytes(&y, sizeof(y));
假设你有一个叫做内存的intvariables。 确保你看到它有多less位; 对于许多处理器来说,int是32位以及一个存储器地址。 所以你需要循环每一点,像这样:
unsigned int memory = 1234; for (int i = 0; i < 32; i++) { printf("%d ", memory >> i & 1); }
这种简单的方法将每个位与1进行或运算,并将每位移位1。
#include <stdio.h> #include <stdlib.h> void print_bits ( void* buf, size_t size_in_bytes ) { char* ptr = (char*)buf; for (size_t i = 0; i < size_in_bytes; i++) { for (short j = 7; j >= 0; j--) { printf("%d", (ptr[i] >> j) & 1); } printf(" "); } printf("\n"); } int main ( void ) { size_t n; scanf("%d", &n); print_bits(&n, sizeof(n)); return 0; }
这将以指定的大小(以字节为单位)打印指定对象的位(此处为n
)。
…打印实际表示(二进制…
要将任何variables/对象转换为编码二进制forms的string,请使用帮助函数将内存转换为“二进制”string。 这个方法也处理函数指针。 使用C99或更高版本。
#include <stdio.h> #include <assert.h> #include <limits.h> // .... compound literal ....... #define VAR_TO_STR_BIN(x) obj_to_bin((char [sizeof(x)*CHAR_BIT + 1]){""}, &(x), sizeof (x)) char *obj_to_bin(char *dest, void *object, size_t osize) { const unsigned char *p = (const unsigned char *) object; p += osize; char *s = dest; while (osize-- > 0) { p--; unsigned i = CHAR_BIT; while (i-- > 0) { *s++ = ((*p >> i) & 1) + '0'; } } *s = '\0'; return dest; } int main(void) { int i = 42; double d = 3.1415926535897932384626433832795; printf("Sample\ndouble pi:%s\nint 42:%s\n", VAR_TO_STR_BIN(d), VAR_TO_STR_BIN(i) ); return 0; }
输出(注意:根据字节顺序,结果可能会有所不同)
Sample double pi:0100000000001001001000011111101101010100010001000010110100011000 int 42:00000000000000000000000000101010
这种方法很容易适应hex格式。
@dbush,@Anton,我混合你的代码。 没关系?
#include <stdio.h> #include <stdlib.h> void print_bytes( void *ptr, size_t size ) ; int main( void ) { int x = 123456 ; double y = 3.14 ; print_bytes( &x, sizeof(x) ) ; print_bytes( &y, sizeof(y) ) ; return 0 ; } void print_bytes( void *ptr, size_t size ) { //char *buf = (char*) ptr; unsigned char *p = ptr ; for( size_t i = 0; i < size; i++ ) { printf( "%02hhX ", p[i] ) ; } printf( "\n" ) ; for( size_t i = 0; i < size; i++ ) { for( short j = 7; j >= 0; j-- ) { printf( "%d", ( p[i] >> j ) & 1 ) ; } printf(" "); } printf("\n"); }