整型数据在计算机内存中的存储方式取决于多个因素,包括机器的字节顺序(大端或小端)、整数的大小以及编译器和硬件平台的具体实现。下面是一些基本概念:
原码是将十进制数值直接转换成二进制表示形式,通常用最高位作为符号位,0表示正数,1表示负数。
反码是将原码进行特殊处理得到的,正数的反码与原码相同,负数的反码是其原码除符号位外的所有位取反。
补码是将反码加1得到的,正数的补码与原码相同,负数的补码是其反码加1。
在现代计算机系统中,大部分情况下使用的是补码表示法。
大端存储(Big-Endian):高位字节存放在低地址处,低位字节存放在高地址处。
小端存储(Little-Endian):低位字节存放在低地址处,高位字节存放在高地址处。
例如,一个32位的整数0x12345678
在内存中的存储方式如下:
0x78 0x56 0x34 0x12
0x12 0x34 0x56 0x78
在C语言中,整型变量需要声明其类型,如int
、short
、long
等。每个类型的整型变量会占用一定数量的内存空间,具体数量由编译器决定。一般来说:
char
占用1个字节short
占用2个字节int
占用4个字节long
和long long
占用8个字节这些数字可能会根据目标平台和编译器的不同而有所不同。因此,在编写跨平台代码时,应尽量使用标准库函数来确保行为的一致性。
在C语言中,可以使用类型转换运算符来显式地将一种整型转换为另一种整型。例如,可以使用(int)
将char
类型转换为int
类型。隐式转换也可能会发生,例如在表达式计算过程中,较小类型的数据会被提升到较大类型以避免数据丢失。
使用printf()
函数可以打印整型变量的值。通常使用%d
格式说明符来输出十进制整数,或者使用%x
格式说明符来输出十六进制整数。
注释上有很清晰的原码,反码,补码解释
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 -- 打印十进制的无符号
最后,通过一些代码示例,我们展示了不同整型数据的存储和操作方法,包括有符号和无符号整型、整型之间的转换以及字符串长度计算等问题。