使用%u和%d在C中打印内存地址之间的区别?

前端之家收集整理的这篇文章主要介绍了使用%u和%d在C中打印内存地址之间的区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我读了一本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.

猜你在找的C&C++相关文章