使用%u和C中的%d打印内存地址之间的区别?
我读了一本C书。 要打印出变量的内存地址,有时书籍会使用:
printf("%u\n",&n);
有时,作者写道:
printf("%d\n",&n);
结果总是一样,但我不明白两者之间的差异(我知道%u表示无符号)。
有人可以详细说明吗?
非常感谢。
%u
将整数视为无符号,而%d
将整数视为有符号。 如果整数介于0和INT_MAX
之间(在32位系统上为2 31 -1),则两种情况的输出都相同。
如果整数为负(对于有符号输入)或在INT_MAX+1
和UINT_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用于签名的