正数:原码 = 反码 = 补码
负数:原码=源码(符号不变) 求反 + 1 = 补码
首位等于符号位
char a = 5; 0000 0101
char b = -5; 1000 0101
反码 0111 1010 求反
补码 0111 1011 +1
1000 0100 求反
源码 1000 0101 +1
CPU只能做加法运算
1000 0000 1既是标志位,又是数值位,因此为-128
#include<limits.h>
usigned char无符号是 128 0 — 255
char 符号是 -128 0–127-- -128 – -1
int main()
{
unsigned char a = 0;
for (a = 0; a < 128; a++)
{
printf("%4d", a);
}
}
输出 0 --- 127
int main()
{
char a = 0;
for (a = 0; a < 128; a++)
{
printf("%4d", a);
}
}
输出 0 -- 127 -128 --- 0 死循环
- short 短整型有2个字节 16个二进制位
- 二分查找
int Find_Value(int *nums,int n, int val)
{
assert(nums != nullptr);
int pos = -1;
int left = 0, right = n;
while (left < right)
{
pos = (right - left) / 2 + left;//防止溢出
if (nums[pos] > val)
{
right = pos;
}
else if (nums[pos] < val)
{
left = pos + 1;
}
else
{
return pos;
}
}
return -1;// 没找到
}
C语言的类型是不可变的(强类型语言)
即使强转变量的地址,但是其类型没有变,只是看的见的变了。(只能是值得改变)
扩充的是符号位,不会改变其原来的正负值
无符号均扩充0
无符号扩展的是 0 不论负值还是正值
有符号,扩展的是符号位,正数符号位为0,负数符号位为1
整型数据值的转换(切片或截取)
从低地址开始切
隐式转化规则:
char a = -5 转换为 unsigned int
原码:1000 0101
1111 1010
补码 1111 1011
扩充 1111 1111 1111 1111 1111 1111 1111 1011 (无符号,很大的值)
与无符号 int b
0000 0000 0000 0000 0000 0000 0000 0000 1010
int main()
{
char a = -5;
unsigned int b = 10;
if (a > b)
{
printf("%x>%x", a, b);
}
if (a < b)
{
printf("%x<%x", a, b);
}
}
int main()
{
for (int i = -4; i < 4u; ++i)
{ //i会被强转为无符号的整型,其无穷大
printf("%5d", i);
}
return 0;
}
- 华为面试题:
int main()
{
char c = 128;
unsigned char uc = 128;
unsigned short us = 0;
us = c + uc; // 1111 1111 1000 0000
// 0000 0000 1000 0000
// 1 0000 0000 0000 0000
us = (unsigned char)c + uc;
//0000 0000 1000 0000
//0000 0000 1000 0000
//0000 0001 0000 0000
us = c + (char)uc;
// 1111 1111 1000 0000;
// 1111 1111 1000 0000;
// 1 1111 1111 0000 0000
//ff00
us = (unsigned short)c + uc;
// 1111 1111 1000 0000
// 0000 0000 1000 0000
// 1 0000 0000 0000 0000
printf("%x", us);
}