helloworld
//注释
/*注释*/
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
Bit与Byte
1byte = 8bit
1bite只能存储:0或1
1个byte能存储: 2^8 -1个0或1,其范围是[-128,127]或[0,255]
数据能存储的位置:寄存器,内存,磁盘等.
整数的编码
整数包括负数、零与正数,在计算机中整数又分为有符号数数与无符号数。有符号数的最高位表示符号:最高位为0时,最高位为1时,表示负数。无符号数表示非负数,整个位数都用来表示整数的值。如果分别有一个8位的有符号数与无符号数,其范围如下:
- 有符号数:[-2^(8-1),2^(8-1) - 1]=[-128,127]
- 无符号数:[0,2^8-1] = [0,255]
整数的原码、反码与补码
- 原码:数值前有一位符号位,其他位表示数值的大小。
- 反码:正整数的反码是其自身,而负整数的反码其绝对值逐位求反。
- 补码:正整数的补码和原码相同,负数的补码就是对负数的反码加1.
数值 | 原码 | 反码 | 补码 |
---|---|---|---|
7 | 0000 0111 | 0000 0111 | 0000 0111 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
-100的原码是 1110,0100 ,反码为:1001,1011,其绝对值是: 0110,0100,取反之后:1001,1011,+1之后为补码,所以补码为:1001,1100.而计算机内部负数的保存方式是负数的补码:
为什么要在计算机中将负数存储成补码,若采用原码的方式:对于负数的负号没办法表示;采用反码的方式:1-1=1+(-1)=(0000,0001)+(1111,1110)= 1111,1111 = (-0),这样会出现+0与-0的情况;采用补码的方式则无问题。
常见的补码表示有:
数值 | 补码 |
---|---|
128 | 1000,0000 |
-1 | 1111,1111 |
0 | 0000,0000 |
127 | 0111,1111 |
整数的存储
计算机数据存储在内存中时,因为内存的存储控件呈线性分布,多字节存储时,可分为 高位存储(big-endian) 和 低位优先存储(little-endian)。
高位优先存储:高位优先存储在低地址上;
地位优先存储:低位优先存储在低地址上。
可用程序测试你的计算机是地位优先还是高位优先:
//方式1
void integer_store()
{
int x = 0x1;
char *p = (char *)&x;
if(*p == 1)
printf("big endian\n");
else
printf("little-endian\n");
}
//方式2
typedef union {
char c;
int a;
} U;
void integer_store()
{
U u;
u.a = 1;
if(u.c == 1)
printf("big endian\n");
else
printf("little-endian\n");
}
//在程序这运行测试
int main(void)
{
integer_store();
return 0;
}
整数大尾小尾互换
int change_int_storage(int val)
{
int iRun = 0, i = 0;
char* pByte= (char*)&val; //指向整数的低地址,取一个字节
i = sizeof(int)-1;
while (i >= 0)
{
iRun |= *pByte<<(i*8);//把整数的第1字节,第2字节,第3字节,第四4字节一次左移24位,16位,8位和0位
pByte++;
i--;
}
return iRun;
}