加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:08:09 所属栏目:百科 来源:网络整理
导读:我读了一本C书.要打印一个变量的内存地址,有时书会使用: printf("%un",n); 有时作者写道: printf("%dn",n); 结果总是一样的,但我不明白两者之间的差异(我知道%u为无符号). 有人可以详细说明吗? 非常感谢. 解决方法 %u将整数视为无符号,而%d将整数视
我读了一本C书.要打印一个变量的内存地址,有时书会使用:
printf("%un",&n);

有时作者写道:

printf("%dn",&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: %pn",&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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读