1.原码:所谓原码是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值大小。
正数的原码=>反码=>补码
负数的补码是符号位不变,其余位按位取反,在加1变为补码。
2.数值的值域和类型有关
无符号:0-127
有符号:
1字节:1111 1111(-1)
2字节:1111 1111 1111 1111(-1)
4字节:1111 1111 1111 1111 1111 1111 1111 1111(-1)
无符号:
1字节:1111 1111(0-255)
2字节:1111 1111 1111 1111(0-65535)
4字节:1111 1111 1111 1111 1111 1111 1111 1111()
3.
二分查找数据溢出解决方案
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include<limits.h>
//二分查找
int FindValue(int* br, int n, int val)
{
assert(br != nullptr);
int pos = -1;
int left = 0, right = n - 1;
while (left < right)
{
int mid = (right - left) / 2 + left;
}
}
4.华为面试:由于类型不同的大小比较
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include<limits.h>
int main()
{
char a = -5;//原码:1000 0101 补码:1111 1011
unsigned int b = 10;
if (a > b)
{
printf("%d>%d\n", a, b);
}
else
{
printf("%d<%d\n", a, b);
}
return 0;
}
5.程序运行结果为空
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include<limits.h>
int main()
{
for (int i = -4; i < sizeof(int); ++i)
{
printf("%5d", i);
}
return 0;
}
原因为sizeof计算出来的字节个数为无符号,所以sizoof(int)值为4U,4U为一个超级大的数字,所以系统不会打印
6.数值打印,关于类型值域的
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include<limits.h>
int main()
{
char c = 128;
unsigned char uc = 128;
unsigned short us = 0;
us = c + uc;
printf("%x \n", us);
us = (unsigned char)c + uc;
printf("%x \n", us);
us = c + (char)uc;
printf("%x \n", us);
us = (unsigned short)c + uc;
printf("%x \n", us);
return 0;
}