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

时间:2011-03-06 04:10:54

标签: c unsigned

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

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

有时,作者写道:

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

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

有人可以详细说明吗?

非常感谢。

5 个答案:

答案 0 :(得分:38)

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

如果整数为负(对于有符号输入)或在INT_MAX+1UINT_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是已签名的