gpt4 book ai didi

c - 为什么显示的地址为负值

转载 作者:行者123 更新时间:2023-11-30 21:36:24 31 4
gpt4 key购买 nike

我正在学习指针并尝试尝试它!这是我的代码..

#include<stdio.h>

int main() {
int a[2]={1,2};
int* p=a;
int* q=&a;
int *r=&a[0];
printf("%d %d %d",p,q,r);
return 0;
}

代码的输出是:

-20578720 -20578720 -20578720  

现在当我改变 qinteger variable ,地址不是负数:

#include<stdio.h>

int main() {
int a[2]={1,2};
int* p=a;
int q =*a;//this is the change
int *r=&a[0];
printf("%d %d %d",p,q,r);
return 0;
}

现在输出:

1822271664 1 1822271664

我尝试在网上搜索并找到了这个memory address positive or negative value in c?它告诉我使用%p,我照做了,得到了正十六进制地址值,如下:

0x7ffc4b5dbb90 0x7ffc4b5dbb90 0x7ffc4b5dbb90  

现在我有了正确答案,但不知道

  1. 为什么%p有效但%d无效以及
  2. 为什么在将q整数之后,地址是

对于第一个,我得到了这个,但我无法理解答案:Difference between %d and %p printf format string directives in c language?

最佳答案

指针应打印 %p不是%d : 数字可能太大,所以溢出了。

<小时/>

编辑让我更清楚地说明这一点:诸如 int 之类的类型char等具有固定数量的位/字节。即使两种类型具有相同的位数,区别也在于计算机解释它们的方式。对于整数(包括字符),使用 n位可以表示 2^n值(value)观。有符号整数使用其中的一些来表示负数:特别是您可以表示 -2^(n/2) 范围内的数字。至2^(n/2) - 1 。相反,unsigned int 表示 0 中的数字。至2^n - 1 。最大整数的所有位均设置为 1(最高有效位除外)。得到对应的正数步骤完全相同

负数使用 Two's complement 计算:采用正数的位表示形式,进行逐位求反,然后将结果加 1。负数的最高有效位设置为 1。

让我们考虑 2 位:您可以用它表示 4 个值。如果使用无符号表示,则二进制数 10显然对应于1 。相反,如果您将其解释为有符号数,则其值为 -2 .

另一个例子是下面考虑一个 8 位整数:00001011 。这是一个正数。假设您将其转换为较小尺寸的整数类型,例如 4 位。根据this answer ,最常见的行为(实际上取决于实现)是丢弃最高有效位。这样你的号码就会变成1011但使用 int表示它现在被视为负数。

<小时/>

您可能会尝试将 is 打印为无符号 %u :

printf("%u %u %u",(unsigned int)(p),(unsigned int)(q),(unsigned int)(r));

另请注意,我收到警告:warning: incompatible pointer types initializing 'int *' with an expression of type 'int (*)[2]' [-Wincompatible-pointer-types]

对于

int *q  = &a;

编辑

例如,在我的计算机上运行的此程序中,对于指针(类型为 int )返回 8 字节的大小,对于 int 则返回 4 字节的大小。 :

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
printf("size of int*: %lu\n", sizeof(int*));
printf("size of int: %lu\n", sizeof(int));
return 0;


}

由此看来,您似乎正在遵循我给出的示例的第二种情况。

请注意随着指针尺寸变大,也会强制转换为 unsigned int可能还不够。

关于c - 为什么显示的地址为负值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54260802/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com