C++ 使用指针分离整数的位数
我有一个整数(I)占据4个字节,我假设它像这样存储在内存中,起始地址为1000 如果我写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
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);