数据类型的等级从低到高如下:char int long float double运算的时候是从低转到高的,表达式的类型会自动提升或者转换为参与表达式求值的最上级类型
#include <stdio.h>
int main()
{
int x = -1;
unsigned int y = 2;
if (x > y)
{
printf("x is greater");
}
else
{
printf("y is greater");
}
return 0;
}
//x is greater
x是有符号数-1,内存中是全1,当有符号的x和无符号数进行比较时,x会隐式类型转换被当做无符号数,是一个很大的数
int k, a, b;
unsigned int w = 5;
double x = 1.42;
取余操作两边必须是整数
#include <stdio.h>
void func()
{
int k1 = 1 << 31;
//1000 0000 0000 0000 0000 0000 0000 0000
//1 1000 0000 0000 0000 0000 0000 0000 0000
//
//-2147483648
//2的31次方
int k2 = k1 >> 31;
//
int k3 = 1 ^ k2;
//-1 和 1
// 1111 1111 1111 1111
// 0000 0000 0000 0001
// 1111 1111 1111 1110
// 1000 0000 0000 0010 -2
int k = 1 ^ (1 << 31 >> 31);
printf("%d\n", k);
}
int main()
{
func();
return 0;
}
(1 << 31 )左移31位 并在右侧填充0 得到0x80000000 即符号位为1 其他为0 即-2147483648
int k = 1^(1 << 31 >> 31);注意,这里在右移的时候,符号位保持为1,右移后填充1,结果为0xFFFFFFFF,即-1
0x00000001^0xFFFFFFFF,即0xFFFFFFFE(-2)
#include <stdio.h>
int main()
{
int i = 1;
sizeof(i++);
printf("%d\n", i);//1
return 0;
}
一般表达式的运算是在运行时执行的,而sizeof是一个编译阶段就执行的运算符,在其内的任何运算都不执行,只推测出其中表达式结果的类型求其大小,故前后i的值不变。
#include <stdio.h>
int main()
{
int i = 1;
sizeof(i++);
printf("%d\n", i);//1
printf("%d\n", sizeof(i++));//4
return 0;
}
最大连续1的个数
给定一个二进制数组 nums , 计算其中最大连续 1 的个数。
题目来源
int findMaxConsecutiveOnes(int* nums, int numsSize){
int max_size = 0;
int cur_size = 0;
int i = 0;
int n = numsSize;
for(i=0;i<n;i++){
if(nums[i] == 1){
cur_size++;
}else{
max_size = (max_size>cur_size)?max_size:cur_size;
cur_size = 0;
}
}
return max_size>cur_size?max_size:cur_size;
}
完全数计算
题目来源
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
输入n,请输出n以内(含n)完全数的个数。
#include <stdio.h>
int isperfect(int x){
int i = 0;
int sum = 0;
for(i=1;i<x;i++){
if(x%i == 0){
sum+=i;
}
}
if(sum == x){
return 1;
}else{
return 0;
}
}
int main() {
int n = 0;
scanf("%d",&n);
int i = 0;
int sum = 0;
for(i=1;i<=n;i++){
if(isperfect(i)){
sum++;
}
}
printf("%d\n",sum);
return 0;
}