c和c++各种类型数据左移溢出对比
c int:
1 #include<stdio.h> 2 main(){ 3 //int 4 int j=1; //<<31==2147483648 5 // 1<<32==1 6 // (1<<32)-1==0 7 // (1<<32)-2==4294967295 8 for(int i=30;i<(1<<5)+1;i++) 9 printf("1<<%d==%ld\n",i,j<<i); 10 printf("(1<<%d)-1==%ld\n",32,(j<<32)-1); 11 printf("(1<<%d)-2==%ld\n",32,(j<<32)-2); 12 }
运行结果:
1<<30==1073741824
1<<31==2147483648
1<<32==1
(1<<32)-1==0
(1<<32)-2==4294967295
c unsigned int:
1 #include<stdio.h> 2 main(){ 3 //unsigned int 4 unsigned int j=1;//1<<31==2147483648 5 // 1<<32==1 6 // (1<<32)-1==0 7 // (1<<32)-2==4294967295 8 for(int i=30;i<(1<<5)+1;i++) 9 printf("1<<%d==%ld\n",i,j<<i); 10 printf("(1<<%d)-1==%ld\n",32,(j<<32)-1); 11 printf("(1<<%d)-2==%ld\n",32,(j<<32)-2); 12 }
运行结果:
1<<30==1073741824
1<<31==2147483648
1<<32==1
(1<<32)-1==0
(1<<32)-2==4294967295
c long:
1 #include<stdio.h> 2 main(){ 3 //long 4 long j=1;//1<<63==-9223372036854775808 5 // 1<<64==1 6 // (1<<63)-1==9223372036854775807 7 // (1<<64)-1==0 8 // (1<<64)-2==-1 9 for(int i=62;i<(1<<6)+1;i++) 10 printf("1<<%d==%ld\n",i,j<<i); 11 printf("(1<<%d)-1==%ld\n",63,(j<<63)-1); 12 printf("(1<<%d)-1==%ld\n",64,(j<<64)-1); 13 printf("(1<<%d)-2==%ld\n",64,(j<<64)-2); 14 }
运行结果:
1<<62==4611686018427387904
1<<63==-9223372036854775808
1<<64==1
(1<<63)-1==9223372036854775807
(1<<64)-1==0
(1<<64)-2==-1
c unsigned long:
1 #include<stdio.h> 2 main(){ 3 // unsigned long 4 unsigned long j=1;//1<<63==-9223372036854775808 5 // 1<<64==1 6 // (1<<63)-1==9223372036854775807 7 // (1<<64)-1==0 8 // (1<<64)-2==-1 9 for(int i=62;i<(1<<6)+1;i++) 10 printf("1<<%d==%ld\n",i,j<<i); 11 printf("(1<<%d)-1==%ld\n",63,(j<<63)-1); 12 printf("(1<<%d)-1==%ld\n",64,(j<<64)-1); 13 printf("(1<<%d)-2==%ld\n",64,(j<<64)-2); 14 }
运行结果:
1<<62==4611686018427387904
1<<63==-9223372036854775808
1<<64==1
(1<<63)-1==9223372036854775807
(1<<64)-1==0
(1<<64)-2==-1
c完整测试代码:
1 #include<stdio.h> 2 main(){ 3 //int 4 printf("int:\n"); 5 int j=1; //<<31==2147483648 6 // 1<<32==1 7 // (1<<32)-1==0 8 // (1<<32)-2==4294967295 9 for(int i=30;i<(1<<5)+1;i++) 10 printf("1<<%d==%ld\n",i,j<<i); 11 printf("(1<<%d)-1==%ld\n",32,(j<<32)-1); 12 printf("(1<<%d)-2==%ld\n",32,(j<<32)-2); 13 // unsigned int 14 printf("\nunsigned int:\n"); 15 unsigned int j2=1;//1<<31==2147483648 16 // 1<<32==1 17 // (1<<32)-1==0 18 // (1<<32)-2==4294967295 19 for(int i=30;i<(1<<5)+1;i++) 20 printf("1<<%d==%ld\n",i,j2<<i); 21 printf("(1<<%d)-1==%ld\n",32,(j2<<32)-1); 22 printf("(1<<%d)-2==%ld\n",32,(j2<<32)-2); 23 //long 24 printf("\nlong:\n"); 25 long j3=1;//1<<63==-9223372036854775808 26 // 1<<64==1 27 // (1<<63)-1==9223372036854775807 28 // (1<<64)-1==0 29 // (1<<64)-2==-1 30 for(int i=62;i<(1<<6)+1;i++) 31 printf("1<<%d==%ld\n",i,j3<<i); 32 printf("(1<<%d)-1==%ld\n",63,(j3<<63)-1); 33 printf("(1<<%d)-1==%ld\n",64,(j3<<64)-1); 34 printf("(1<<%d)-2==%ld\n",64,(j3<<64)-2); 35 // unsigned long 36 printf("\nunsigned long:\n"); 37 unsigned long j4=1;//1<<63==-9223372036854775808 38 // 1<<64==1 39 // (1<<63)-1==9223372036854775807 40 // (1<<64)-1==0 41 // (1<<64)-2==-1 42 for(int i=62;i<(1<<6)+1;i++) 43 printf("1<<%d==%ld\n",i,j4<<i); 44 printf("(1<<%d)-1==%ld\n",63,(j4<<63)-1); 45 printf("(1<<%d)-1==%ld\n",64,(j4<<64)-1); 46 printf("(1<<%d)-2==%ld\n",64,(j4<<64)-2); 47 }
运行结果:
int:
1<<30==1073741824
1<<31==2147483648
1<<32==1
(1<<32)-1==0
(1<<32)-2==4294967295
unsigned int:
1<<30==1073741824
1<<31==2147483648
1<<32==1
(1<<32)-1==0
(1<<32)-2==4294967295
long:
1<<62==4611686018427387904
1<<63==-9223372036854775808
1<<64==1
(1<<63)-1==9223372036854775807
(1<<64)-1==0
(1<<64)-2==-1
unsigned long:
1<<62==4611686018427387904
1<<63==-9223372036854775808
1<<64==1
(1<<63)-1==9223372036854775807
(1<<64)-1==0
(1<<64)-2==-1
--------------------------------------------------------------
c++如果输出用printf则所有结果与c相同。
下面是用std::cout<<;的输出方式的测试中与printf不同的地方
c++ int:
(1<<32)-2==
printf():4294967295
std::cout<<::-1
std::cout<<:18446744073709551615
c++完整测试代码:
1 #include<iostream> 2 main(){ 3 //int 4 printf("int:\n"); 5 int j=1; //<<31==2147483648 6 // 1<<32==1 7 // (1<<31)-1==2147483647 8 // (1<<32)-1==0 9 // (1<<32)-2==4294967295 -1 10 for(int i=30;i<(1<<5)+1;i++){ 11 printf("1<<%d==%ld\n",i,j<<i); 12 std::cout<<"1<<"<<i<<"=="<<(j<<i)<<"\n";} 13 std::cout<<"(1<<31)-1"<<"=="<<(j<<31)-1<<"\n"; 14 std::cout<<"(1<<32)-1"<<"=="<<(j<<32)-1<<"\n"; 15 std::cout<<"(1<<32)-2"<<"=="<<(j<<32)-2<<"\n"; 16 printf("(1<<%d)-1==%ld\n",31,(j<<31)-1); 17 printf("(1<<%d)-1==%ld\n",32,(j<<32)-1); 18 printf("(1<<%d)-2==%ld\n",32,(j<<32)-2); 19 // unsigned int 20 printf("\nunsigned int:\n"); 21 unsigned int j2=1;//1<<31==2147483648 22 // 1<<32==1 23 // (1<<32)-1==0 24 // (1<<32)-2==4294967295 25 for(int i=30;i<(1<<5)+1;i++){ 26 printf("1<<%d==%ld\n",i,j2<<i); 27 std::cout<<"1<<"<<i<<"=="<<(j2<<i)<<"\n";} 28 std::cout<<"(1<<31)-1"<<"=="<<(j2<<31)-1<<"\n"; 29 std::cout<<"(1<<32)-1"<<"=="<<(j2<<32)-1<<"\n"; 30 std::cout<<"(1<<32)-2"<<"=="<<(j2<<32)-2<<"\n"; 31 printf("(1<<%d)-1==%ld\n",31,(j2<<31)-1); 32 printf("(1<<%d)-1==%ld\n",32,(j2<<32)-1); 33 printf("(1<<%d)-2==%ld\n",32,(j2<<32)-2); 34 //long 35 printf("\nlong:\n"); 36 long j3=1;//1<<63==-9223372036854775808 37 // 1<<64==1 38 // (1<<63)-1==9223372036854775807 39 // (1<<64)-1==0 40 // (1<<64)-2==-1 41 for(int i=62;i<(1<<6)+1;i++){ 42 printf("1<<%d==%ld\n",i,j3<<i); 43 std::cout<<"1<<"<<i<<"=="<<(j3<<i)<<"\n";} 44 std::cout<<"(1<<63)-1"<<"=="<<(j3<<63)-1<<"\n"; 45 std::cout<<"(1<<64)-1"<<"=="<<(j3<<64)-1<<"\n"; 46 std::cout<<"(1<<64)-2"<<"=="<<(j3<<64)-2<<"\n"; 47 printf("(1<<%d)-1==%ld\n",63,(j3<<63)-1); 48 printf("(1<<%d)-1==%ld\n",64,(j3<<64)-1); 49 printf("(1<<%d)-2==%ld\n",64,(j3<<64)-2); 50 // unsigned long 51 printf("\nunsigned long:\n"); 52 unsigned long j4=1;//1<<63==-9223372036854775808 53 // 1<<64==1 54 // (1<<63)-1==9223372036854775807 55 // (1<<64)-1==0 56 // (1<<64)-2==-1 ,18446744073709551615 57 for(int i=62;i<(1<<6)+1;i++){ 58 printf("1<<%d==%ld\n",i,j4<<i); 59 std::cout<<"1<<"<<i<<"=="<<(j4<<i)<<"\n";} 60 std::cout<<"(1<<63)-1"<<"=="<<(j4<<63)-1<<"\n"; 61 std::cout<<"(1<<64)-1"<<"=="<<(j4<<64)-1<<"\n"; 62 std::cout<<"(1<<64)-2"<<"=="<<(j4<<64)-2<<"\n"; 63 printf("(1<<%d)-1==%ld\n",63,(j4<<63)-1); 64 printf("(1<<%d)-1==%ld\n",64,(j4<<64)-1); 65 printf("(1<<%d)-2==%ld\n",64,(j4<<64)-2); 66 }
运行结果:
int:
1<<30==1073741824
1<<30==1073741824
1<<31==2147483648
1<<31==-2147483648
1<<32==1
1<<32==1
(1<<31)-1==2147483647
(1<<32)-1==0
(1<<32)-2==-1
(1<<31)-1==2147483647
(1<<32)-1==0
(1<<32)-2==4294967295
unsigned int:
1<<30==1073741824
1<<30==1073741824
1<<31==2147483648
1<<31==2147483648
1<<32==1
1<<32==1
(1<<31)-1==2147483647
(1<<32)-1==0
(1<<32)-2==4294967295
(1<<31)-1==2147483647
(1<<32)-1==0
(1<<32)-2==4294967295
long:
1<<62==4611686018427387904
1<<62==4611686018427387904
1<<63==-9223372036854775808
1<<63==-9223372036854775808
1<<64==1
1<<64==1
(1<<63)-1==9223372036854775807
(1<<64)-1==0
(1<<64)-2==-1
(1<<63)-1==9223372036854775807
(1<<64)-1==0
(1<<64)-2==-1
unsigned long:
1<<62==4611686018427387904
1<<62==4611686018427387904
1<<63==-9223372036854775808
1<<63==9223372036854775808
1<<64==1
1<<64==1
(1<<63)-1==9223372036854775807
(1<<64)-1==0
(1<<64)-2==18446744073709551615
(1<<63)-1==9223372036854775807
(1<<64)-1==0
(1<<64)-2==-1