printf("%u\n",&n);
有时,作者写道:
printf("%d\n",&n);
结果总是一样,但我不明白两者之间的差异(我知道%u代表无符号)。
有人可以详细说明吗?
非常感谢。
答案 0 :(得分:38)
%u
将整数视为无符号,而%d
将整数视为有符号。如果整数介于0和INT_MAX
之间(在32位系统上为2 31 -1),则两种情况下的输出都相同。
如果整数为负(对于有符号输入)或在INT_MAX+1
和UINT_MAX
之间(例如在2 31 和2 32 <之间),则只会产生差异/ SUP> -1)。在这种情况下,如果您使用%d
说明符,则会得到一个负数,而如果您使用%u
,则会得到一个大的正数。
地址仅作为无符号数字有意义,因此从来没有任何理由将它们打印为带符号数字。此外,当它们被打印出来时,它们通常以十六进制(使用%x
格式说明符)打印,而不是十进制。
你应该只使用地址的%p
格式说明符,但它保证适用于所有有效指针。如果您使用的是32位整数而是64位指针的系统,如果您尝试使用%d
,%u
或%x
中的任何一个而不使用{{}打印指针1}}长度修饰符,你会得到错误的结果以及后来打印的任何其他内容(因为ll
只读取指针参数的8个字节中的4个);如果你确实添加了printf
长度修饰符,那么你将无法移植到32位系统。
底线:始终使用ll
打印指针/地址:
%p
确切的输出格式是实现定义的(C99§7.19.6.1/ 8),但它几乎总是打印为无符号十六进制数,通常带有前导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"
。
答案 1 :(得分:1)
%d
和%u
将打印相同的结果。但是,这根本不是可移植代码,并不是好的风格。我希望你的书比这个例子更好。
答案 2 :(得分:0)
你尝试过什么价值?正如你所说的那样,未签名与签名的区别。那它做了什么,你期待什么?
正符号值与unsigned相同,所以我可以假设您使用较小的值进行测试吗?负面价值怎么样?
最后,如果您正在尝试打印变量的地址(就像您看到的那样),请改用%p。
答案 3 :(得分:0)
所有地址都是无符号32位或64位,具体取决于机器(无法写入负地址)。使用%d是不合适的,但通常会起作用。建议使用%u或%ul。
答案 4 :(得分:0)
没有这种区别,如果您刚刚开始学习指针,请不要感到困惑。 %u是未签名的。%d是已签名的