数据存储:整形

整型数据在计算机内存中的存储方式取决于多个因素,包括机器的字节顺序(大端或小端)、整数的大小以及编译器和硬件平台的具体实现。下面是一些基本概念:

1. 原码、反码和补码:

原码是将十进制数值直接转换成二进制表示形式,通常用最高位作为符号位,0表示正数,1表示负数。

反码是将原码进行特殊处理得到的,正数的反码与原码相同,负数的反码是其原码除符号位外的所有位取反。

补码是将反码加1得到的,正数的补码与原码相同,负数的补码是其反码加1。

在现代计算机系统中,大部分情况下使用的是补码表示法。

2. 大端存储和小端存储:

大端存储(Big-Endian):高位字节存放在低地址处,低位字节存放在高地址处。

小端存储(Little-Endian):低位字节存放在低地址处,高位字节存放在高地址处。

例如,一个32位的整数0x12345678在内存中的存储方式如下:

  • 大端存储:地址从低到高为0x78 0x56 0x34 0x12
  • 小端存储:地址从低到高为0x12 0x34 0x56 0x78

3. 整形变量的内存分配

在C语言中,整型变量需要声明其类型,如intshortlong等。每个类型的整型变量会占用一定数量的内存空间,具体数量由编译器决定。一般来说:

  • char占用1个字节
  • short占用2个字节
  • int占用4个字节
  • longlong long占用8个字节

这些数字可能会根据目标平台和编译器的不同而有所不同。因此,在编写跨平台代码时,应尽量使用标准库函数来确保行为的一致性。

4. 整型之间的转换

在C语言中,可以使用类型转换运算符来显式地将一种整型转换为另一种整型。例如,可以使用(int)char类型转换为int类型。隐式转换也可能会发生,例如在表达式计算过程中,较小类型的数据会被提升到较大类型以避免数据丢失。

5. 整型类型的打印

使用printf()函数可以打印整型变量的值。通常使用%d格式说明符来输出十进制整数,或者使用%x格式说明符来输出十六进制整数。

6.代码数据示例

注释上有很清晰的原码,反码,补码解释

第一个:
int main() {
	//有符号
	char a = -1;//int类型默认有符号
	signed char b = -1;
	//无符号
	unsigned char c = -1;//255
	//原码:10000001
	//反码:11111110
	//补码:11111111
	printf("a=%d  b=%d  c=%d", a, b, c);
	return 0;
}
第二个:
int main() {
	char a = -128;
	printf("%u\n", a);
	//1000000000000010000000
	//1111111111111101111111
	//11 1111 1111 1110 0000 0011
	
	//11 1111 1111 1110 0000 0011 -- char8整形提升int32
	
//%d -- 打印十进制的有符号
//%u -- 打印十进制的无符号
	return 0;
}
第三个:
int main() {
		int a = -20;
					//原码:10000000 00000000 00000000 00010100
					//反码;11111111 11111111 11111111 11101011
					//补码:11111111 11111111 11111111 11101100 -- -20

unsigned int b = 10;//补码:00000000 00000000 00000000 00001010 -- 10
				
		//计算结果  //11111111 11111111 11111111 11110110
					//11111111 11111111 11111111 11110101
					//00000000 00000000 00000000 00001010 -- -10
	
	printf("%d\n", a + b);

	return 0;
}
第四个:
int main() {
	unsigned int i;//无符号到-1的时候,-1会变成补码就会是一个很大的数字,再依次递减到0,又重复就无限循环了
	 //int i;
	for ( i = 9; i >=  0; i--)
	{
		printf("%u\n", i);//9 8 7 6 5 4 3 2 1 0 (-1) -- 111111111111111111111111111111111
		//printf("%d\n", i);
	}

	return 0;
}
第五个:
int main() {
	char a[1000];//-128~127这个范围走这1000个字符遇到0就结束,也就是-1到-128到127到0 ,加起来255个字符
	for (int i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));//-1到-128 127到0  == 128+127=255 
	return 0;
}
第六个:
int main() {
	unsigned char i = 0;//0到255 (永远成立)255+1==0
	for ( i = 0; i <= 255; i++)
	{
		printf("hello world\n");
	}

	return 0;
}

//%d -- 打印十进制的有符号                   //%u -- 打印十进制的无符号

最后,通过一些代码示例,我们展示了不同整型数据的存储和操作方法,包括有符号和无符号整型、整型之间的转换以及字符串长度计算等问题。

你可能感兴趣的:(c语言)