简体   繁体   中英

Why a long behaving like an int in C?

I am following along with the k&r C book, and I stumbled across something odd doing excersice 2-1(determine maximum sizes of short, int, and long on your machine). I wrote this code for it:

#include <stdio.h>

int main()
{
    long a;
    long lasta;
    int b , lastb;
    short int c, lastc;

    lasta = lastb = lastc = 1;
    a = b = c = 2;
    while (a || b || c) {
        printf("lasta = %d\n", lasta); //for debugging
        a = a * 2;
        b = b * 2;
        c = c * 2;
        lasta = lasta * 2;
        lastb = lastb * 2;
        lastc = lastc * 2;
        if (a < lasta) {
            printf("%d\n", lasta * 2 - 1);
            a = lasta = 0;
        }
        if (b < lastb) {
            printf("%d\n", lastb * 2 - 1);      
            b = lastb = 0;
        }
            if (c < lastc) {
            printf("%d\n", lastc * 2 - 1);      
            c = lastc = 0;      
        }
    }
}

and I am getting a weird bug where it seems to work for short and int, but not long. I thing it is behaving as if lasta was a regular int. Here is the output:

lasta = 1
lasta = 2
lasta = 4
lasta = 8
lasta = 16
lasta = 32
lasta = 64
lasta = 128
lasta = 256
lasta = 512
lasta = 1024
lasta = 2048
lasta = 4096
lasta = 8192
32767
lasta = 16384
lasta = 32768
lasta = 65536
lasta = 131072
lasta = 262144
lasta = 524288
lasta = 1048576
lasta = 2097152
lasta = 4194304
lasta = 8388608
lasta = 16777216
lasta = 33554432
lasta = 67108864
lasta = 134217728
lasta = 268435456
lasta = 536870912
2147483647
lasta = 1073741824
lasta = -2147483648
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
lasta = 0
-1

I realize i could get the answer just by looking at the value of a, but I want to figure out whats going on here

printf with %d means it thinks it's an int.

try %lu and it will print an unsigned long

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM