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

我读了一本C书。 要打印出变量的内存地址,有时书籍会使用:

printf("%u\n",&n); 

有时,作者写道:

 printf("%d\n",&n); 

结果总是一样,但我不明白两者之间的差异(我知道%u表示无符号)。

有人可以详细说明吗?

非常感谢。

%u将整数视为无符号,而%d将整数视为有符号。 如果整数介于0和INT_MAX之间(在32位系统上为2 31 -1),则两种情况的输出都相同。

如果整数为负(对于有符号输入)或在INT_MAX+1UINT_MAX之间(例如在2 31和2 32 -1之间),则只会产生差异。 在这种情况下,如果你使用%d说明符,你会得到一个负数,而如果你使用%u ,你会得到一个大的正数。

地址只作为无符号数字有意义,所以从来没有任何理由将它们打印为带符号的数字。 此外,当它们打印出来时,它们通常以hex(使用%x格式说明符)打印,而不是十进制。

你应该只使用%p格式说明符来表示地址,但它保证适用于所有有效指针。 如果您使用的是32位整数但64位指针的系统,如果您尝试使用%d%u%x任何一个打印指针而不使用ll长度修饰符,则会得到错误的结果为此以及稍后打印的任何其他内容(因为printf只读取指针参数的8个字节中的4个); 如果你确实添加了ll length修饰符,那么你就无法移植到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),但它几乎总是打印为无符号的hex数,通常带有前导0x

%d%u将在未设置最高有效位时打印相同的结果。 但是,这根本不是可移植的代码,并不是好的风格。 我希望你的书比这个例子更好。

你尝试过什么价值? 正如你所说的那样,未签名与签名的区别。 那么它做了什么,你期待什么?

正符号值与unsigned相同,所以我可以假设您使用较小的值进行测试吗? 负面价值怎么样?

最后,如果您尝试打印变量的地址(如您所示),请改用%p。

所有地址都是无符号32位或64位,具体取决于机器(不能写入负地址)。 使用%d是不合适的,但通常会起作用。 建议使用%u或%ul。

没有这样的差异,如果你刚刚开始学习指针,就不要感到困惑。 %u用于未签名的。%d用于签名的