我读了一本C书.要打印一个变量的内存地址,有时书会使用:
printf("%u\n",&n);
有时作者写道:
printf("%d\n",&n);
结果总是一样的,但我不明白两者之间的差异(我知道%u为无符号).
有人可以详细说明吗?
非常感谢.
解决方法
%u将整数视为无符号,而%d将整数视为已签名.如果整数介于0之间,则INT_MAX(32位系统上为231-1),则两种情况下的输出是相同的.
如果整数为负(对于带符号输入)或INT_MAX 1和UINT_MAX之间(例如,231和232-1之间),则仅产生差异.在这种情况下,如果使用%d说明符,则会得到一个负数,而如果使用%u,则会得到一个大的正数.
地址只有无符号数字才有意义,所以没有任何理由将其作为签名数字打印出来.此外,当它们打印出来时,它们通常以十六进制打印(使用%x格式说明符),而不是十进制.
你应该真的只是使用%p格式说明符来处理地址,尽管如此,它保证为所有有效的指针工作.如果您使用的是32位整数但64位指针的系统,如果您尝试使用%d,%u或%x中的任何一个打印指针而不使用ll长度修饰符,则会得到错误的结果对于那个和以后再打印的任何东西(因为printf只读取8个字节的指针参数中的4个);如果您添加了ll长度修饰符,那么您将不能移植到32位系统.
底线:始终使用%p打印指针/地址:
printf("The address of n is: %p\n",&n); // Output (32-bit system): "The address of n is: 0xbffff9ec" // Output (64-bit system): "The address of n is: 0x7fff5fbff96c"
精确的输出格式是实现定义的(C99§7.19.6.1/ 8),但它几乎总是打印为无符号十六进制数,通常带有前导0x.