int main() {int a = -10; //4个字节 - 32个bit位//10000000000000000000000000001010-原码//11111111111111111111111111110101-反码//1111 1111 1111 1111 1111 1111 1111 0110-补码// f f f f f f f 6// 16进制表示:0x ff ff ff f6//4个二进制位为一个16进制位,一个字节等于8个二进制位等于两个16进制位return 0;
}
我们常用的 X86 结构是小端模式,而 KEIL C51 (单片机)则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
练习1:设计一个小程序来判断当前机器的字节序。
#include <stdio.h>
int main() {int a = 1;//体会使用1的好处char* pa = (char*)&a;//注意强制类型转换if (*pa == 1)printf("小端\n");elseprintf("大端\n");return 0;
}
简化:封装函数check_sys;
#include <stdio.h>
int check_sys() {int a = 1;return *(char*)&a;//使用1的好处//不能返回 (char)a;//上面的写法是将a的值从内存中取出然后强制类型转换为char型,a的值还是1//需要返回的是a存入内存中时的低位是什么
}
int main() {if (check_sys() == 1)printf("小端\n");elseprintf("大端\n");return 0;
}
练习2:输出什么?
int main()
{char a = -1;//-1的补码:11111111111111111111111111111111//存入char类型的变量中:11111111//整型提升:11111111111111111111111111111111//原码:10000000000000000000000000000001signed char b = -1;//11111111111111111111111111111111//原码:10000000000000000000000000000001unsigned char c = -1;//无符号数整型提升,高位补0//整型提升:00000000000000000000000011111111//以%d形式打印:有符号——最高位为0——正数——原反补相同//255printf("a=%d,b=%d,c=%d", a, b, c);return 0;
}
练习3:输出什么?
#include <stdio.h>
int main()
{char a = -128;//-128:原码:10000000000000000000000010000000// 补码:11111111111111111111111110000000// 存入char:10000000////%u 以十进制的形式打印无符号整型//%d 以十进制的形式打印有符号整型//整型提升:11111111111111111111111110000000//以%u打印:11111111111111111111111110000000——无符号数原反补相同printf("%u\n", a);return 0;
}
练习4:输出什么?
#include <stdio.h>
int main()
{char a = 128;//注意:char取值范围:-128~127//补码:00000000000000000000000010000000//存入char:10000000//整型提升:11111111111111111111111110000000//以%u打印:11111111111111111111111110000000——原反补相同——十进制:4294967168printf("%u\n", a);return 0;
}
#include <stdio.h>
int main() {int i = -20;//原码:10000000000000000000000000010100//补码:11111111111111111111111111101100unsigned int j = 10;//补码:00000000000000000000000000001010//算术转换为无符号整数:相加//11111111111111111111111111101100//00000000000000000000000000001010//11111111111111111111111111110110//以%d打印://10000000000000000000000000001010//-10printf("%d\n", i + j);return 0;
}
练习6:输出什么?
#include <stdio.h>
#include <windows.h>
int main() {unsigned int i;for (i = 9; i >= 0; i--) {printf("%u\n", i);Sleep(1000);}return 0;
}
注意:unsigned int实际上也是循环,在0~2^32间循环,for循环的条件恒成立,死循环
short类型-两个字节-16bit
signed short:-32768~32767
unsigned short:0~65535
注意:unsigned int实际上也是循环,在0~2^32间循环
练习7:输出什么?
#include <stdio.h>
int main()
{char a[1000];int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;//i: 0 1 .....127 128....//arr[i]:-1 -2.....-128 127 .....0//0前有128个负数和127个正数//strlen(a)=255}printf("%d", strlen(a));return 0;
}