C语言:字节个数,二分查找

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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值