C++ 使用指针分离整数的位数

C++ 使用指针分离整数的位数,c++,pointers,C++,Pointers,我有一个整数(I)占据4个字节,我假设它像这样存储在内存中,起始地址为1000 如果我写int*p=&i p现在在这里存储起始地址1000 如果我增加p,它指向地址1004 有没有办法遍历地址1000、1001、1002和1003,以便我可以使用指针分离和打印数字1、5、2、6? 请帮忙((新手) 我的存储假设可能错误有人能帮我纠正一下吗( 编辑1 根据以下Mohit Jain给出的答案和其他人的建议 unsigned char *cp = reinterpret_cast<unsign

我有一个整数(I)占据4个字节,我假设它像这样存储在内存中,起始地址为1000

如果我写
int*p=&i

p现在在这里存储起始地址1000

如果我增加p,它指向地址1004

有没有办法遍历地址1000、1001、1002和1003,以便我可以使用指针分离和打印数字1、5、2、6? 请帮忙((新手)

我的存储假设可能错误有人能帮我纠正一下吗(

编辑1

根据以下Mohit Jain给出的答案和其他人的建议

unsigned char *cp = reinterpret_cast<unsigned char *>(&i);
for(size_t idx = 0; idx < sizeof i; ++idx) {
  cout << static_cast<int>(cp[idx]);
}
unsigned char*cp=重新解释强制转换(&i);
对于(大小\u t idx=0;idx无法列出内存内容

使用指针(依赖于端点的输出)

unsigned char*cp=重新解释强制转换(&i);
对于(大小\u t idx=0;idx无法列出内存内容

使用指针(依赖于端点的输出)

unsigned char*cp=重新解释强制转换(&i);
对于(大小\u t idx=0;idxcout您可以将指针强制转换为(char*),并将该指针递增为指向各个字节的开头。但是,您对存储的假设是错误的,因此您不会得到那样的数字。

您可以将指针强制转换为(char*)然后将指针指向各个字节的开头。但是,您的存储假设是错误的,因此您不会得到这样的数字。

值为
1526
int
通常不会存储为值为
1
5
2
6
的四个字节

相反,它将以二进制形式存储。假设使用一个小的endian机器,字节将具有以下值:0、0、5、246(如果是大端,则以相反的顺序获得相同的值)。这些数字的原因是,它可以在每个字节中存储0到255之间的值。因此,它存储为5*256+246。当处理内存中的值时,使用十六进制而不是十进制通常很方便(而且很常见),在这种情况下,您可以将其视为0x05F6


获取十进制数字的通常方法涉及的数学比指针更多。例如,最低有效位将是值除以10后的余数。

具有值
1526
int
通常不会存储为具有值
1
5
2
6
的四个字节>

相反,它将以二进制形式存储。假设使用一个小的endian机器,字节将具有以下值:0、0、5、246(如果是大端,则以相反的顺序获得相同的值)。这些数字的原因是,它可以在每个字节中存储0到255之间的值。因此,它存储为5*256+246。当处理内存中的值时,使用十六进制而不是十进制通常很方便(而且很常见),在这种情况下,您可以将其视为0x05F6


获取十进制数字的常用方法涉及的数学比指针更多。例如,最低有效位将是值除以10后的余数。

正如我所见,您希望提取数字的每个数字。 要实现这一目标,您需要:

  • 获取
    i
    除以10的提示。如下操作:
    const int r=i%10;
  • i
    除以10:
    i/=10;
  • 如果
    i
    不是0,则转到1
  • 实现(未测试)可能如下所示:

    do
    {
         const int r = i % 10;
         // do anything you need with r
         i /= 10;
    } while (i > 0);
    

    这将为您提供从较低有效性开始的每个数字。

    正如我看到的,您希望提取数字的每个数字。 要实现这一目标,您需要:

  • 获取
    i
    除以10的提示。如下操作:
    const int r=i%10;
  • i
    除以10:
    i/=10;
  • 如果
    i
    不是0,则转到1
  • 实现(未测试)可能如下所示:

    do
    {
         const int r = i % 10;
         // do anything you need with r
         i /= 10;
    } while (i > 0);
    

    这将为您提供从低有效位开始的每个数字。

    i的类型是什么?您可以使用一个char*类型的指针遍历内存中的一个又一个字节。请注意,整数是二进制编码的,因此十进制数1526编码为0x000005F6(假设32位
    int
    )-您将在字节中看到的值是0、0、5和0xF6/246-可能是另一个顺序(由于)。数字0x01050206将存储在大端机上的图示中-十进制值为17105414-或小端机上的0x0602051=100795649。您在问题中演示的布局称为。它偶尔用于专用目的,但不是通用计算中整数的表示方式典型计算机上的数字。更新了我的问题…请检查:(@DeepN“那么没有办法使用指针获取实际数字吗?”“这样做不需要指针,只需使用除法(按1000100,10)和
    %
    模来确定十进制数字。i的类型是什么?您可以使用char*类型的指针遍历一个又一个字节的内存。请注意,整数是二进制编码的,因此十进制数1526编码为0x000005F6(假设32位
    int
    )-您将在字节中看到的值是0、0、5和0xF6/246-可能是另一个顺序(由于)。数字0x01050206将存储在大端机上的图示中-十进制值为17105414-或小端机上的0x0602051=100795649。您在问题中演示的布局称为。它偶尔用于专用目的,但不是通用计算中整数的表示方式典型计算机上的数字。更新了我的问题…请检查:(@DeepN“所以没有办法使用指针获取实际数字吗?”“你不知道
    std::string digits = std::to_string(i);  // You can alternatively use stringstream
    char *p = digits.c_str();
    for(size_t idx = 0; idx < digits.length(); ++idx) cout << (*p++);
    
    do
    {
         const int r = i % 10;
         // do anything you need with r
         i /= 10;
    } while (i > 0);