请教一个关于c++int类型数据在计算机内是如何存储的问题.

来源:百度知道 编辑:UC知道 时间:2024/06/05 17:12:25
#include <iostream>
using namespace std;

void fun(char*);
void printbinary(int a, int c, int n=0);

int main()
{
int a=2655555333;//(10011110 01001000 10001111 00000101)
printbinary(a,8); // 为什么会出现-1???????????
cout<<endl;
fun((char*)&a);
printbinary(a,8);
cout<<endl;
return 0;
}

/*********************************************************************
**注意这是一个32 位程序,故int 类型占了四个字节,char 类型占一个
**字节。函数fun的作用是把一个整数的四个字节的顺序来个颠倒。
**********************************************************************/
void fun(char*s)
{
char c;
c=*(s+3);
*(s+3)=*(s+0);
*(s+0)=c;
c=*(s+2);
*(s+2)=*(s+1);
*(s+1)=c;
}

/*********************************************************************
**以二进制打印出数值
*********************************************************************/
void printbinary(int a, int c, int n)
{

首先,2655555333 超出了 int 能表示的范围。
int值的范围是–2,147,483,648 to 2,147,483,647。
你可以先 cout << a << endl,看看。
按你的程序来看, a 是个负整数-1639411963,你可以跟踪到最后一行,第一次输出时, a = -1, 而如果用%来计算负整数的余数,就数学上来说,是得不到正确结果的,
负整数的余数应该这样计算:
假设 a%n,结果是rem;
int rem = n - 1 - (-a - 1) % n;
正确的结果应该是1;
而你得到的是 -1;
再说,你一开始就错了,到这步已经无关紧要了。

计算机存储数据有 little-endian,big-endian之分,
可以通过联合等手段知道,具体搜索一下,多得是。