c - 在我的 C 代码中需要帮助 - 获得意外的输出
问题描述
#include <stdio.h>
int main()
{
int a = -1;
char *p = &a;
printf("%x, %x",*p, *(p+1));
return 0;
}
output is = ffffffff,ffffffff
我知道有符号整数表示为 ffffffff。
* 预期结果应该只打印一个字符,因为它是 char *
*(p+1) 是多少 ffffffff ?
有什么区别吗
char *p = &a;
和
char *p;
p = &a;
解决方案
Anint
超过一个字节(多少取决于您的系统)。因此int a = -1;
将至少 2 个字节(或更多)设置为FF
. 现在您创建一个字节指针*p
并指向a
整数的第一个字节的地址。当您x%
对字节使用格式时,该字节将被填充到int
.
当您尝试使用 打印您的第二个字节时int
,*(p+1)
也会%x
将 的输出填充为ff
完整int
的。
更新:
该过程称为“符号扩展”,当使用较小的值代替较长的值时,较小的值被“扩展”,如果符号为正,则向左填充零,而如果符号为负,向左填充,以便将字节FF
视为 intFFFFFFFF
而不是000000FF
. 这被认为是 C 的“特征”,因此 -1 仍然是 -1。
推荐阅读
- amazon-web-services - 更新注册表映像并再次应用服务时,Terraform 不会更新 aws_ecs_service
- csv - 使用groovy在jenkins slave上写一个csv文件
- swift - iOS推送通知即将到来但代码未调用
- spring-boot - 添加 5th Rabbit Listener 导致 Quartz Job 卡在阻塞状态
- python - protobuf 和 python:protoc 可以生成 __init__.py 文件吗?
- swift - 使用计时器更新时间时如何使时间与 macOS 系统时钟同步?
- javascript - 折线图 highchart 中的背景列
- r - 使用参考文件更正州城市名称
- javascript - 为什么有些 `file://` fetch 调用被允许,而另一些被 'Cross-Origin Request Blocked'?
- c# - 如何防止 Tag Helper 呈现并将其显示在 html 代码标签中?