c和c++各种类型数据左移溢出对比

xuweihui / 2023-05-20 / 原文

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 }
View Code

运行结果:

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 }
View Code

运行结果:

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 }
View Code

运行结果:

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 }
View Code

运行结果:

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 }
View Code

运行结果:

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

 

c++ unsigned long:
(1<<64)-2==
printf():-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 }
View Code

 运行结果:

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