2016-11-07 2 views
-1

Я знаю, что различие между целыми числами без знака равнозначно тому, как интерпретируется старший бит целого числа. Если указано указанное целое число со знаком, то компилятор C сгенерирует код, предполагающий, что бит старшего разряда используется в качестве знакового знака.бит верхнего порядка в C

Как компилятор использует бит высокого порядка как знак знака?

Как это выглядит в памяти в двоичном формате, когда я пишу signed int num = 23;?

спасибо.

+0

Зависит от процессора, даже если он знаком или без знака: см big- endian и little-endian. – nicomp

+0

Есть больше факторов. Какая endianess используется в целевой архитектуре? –

+0

«Endianness» системы используется для определения того, является ли бит верхнего или нижнего порядка – smac89

ответ

2

Что такое бит высокого порядка или младший бит целого числа?

Когда вы записываете биты двоичного представления числа слева направо, включая начальные нули (если есть), самый левый бит - бит высокого порядка; самый правый бит - младший бит.

, когда указано указанное целое число со знаком, тогда компилятор C сгенерирует код, предполагающий, что бит старшего разряда используется в качестве знакового знака? Как компилятор использует бит высокого порядка в качестве знакового знака?

Данное описание относится к оборудованию, для которого предназначен компилятор. Причиной этого является то, что представление отрицательных чисел идет рука об руку с арифметической единицей ЦП, что создает представление негативов, специфичных для данного оборудования.

Как это выглядит в памяти, когда я пишу подписанный int num = 23;

Так как число 23, его подписал представление в памяти такое же, как и у беззнаковое представления 23, т.е. 0x00000017 в шестнадцатеричном на компьютерах с 4-байтовых целых чисел.

2

В дополнение к большому ответу daslinkenlight, вот программа для игрушек, которая печатает двоичное представление интегрального типа.

Пример C++ код:

#include <climits> 
#include <iostream> 
#include <iomanip> 
#include <string> 
#include <type_traits> 

template<typename T, 
     typename = typename std::enable_if<std::is_integral<T>::value, T>::type> 
std::string get_raw_bytes(T t) { 
    const auto limit = sizeof(T) * CHAR_BIT; 
    std::string bits(limit, '0'); 
    for(auto i = 0; i < limit; i++) { 
    bits[limit - i - 1] = ((t >> i) & 1) ? '1' : '0'; 
    } 
    return bits; 
} 

int main() { 
    std::cout << "Integers:\n"; 
    for (int i = -5 ; i < 6 ; i++) { 
    std::cout << std::setw(4) << i << " " << get_raw_bytes(i) << '\n'; 
    } 

    std::cout << "Character:\n"; 
    std::cout << std::setw(4) << (char)104 << " " << get_raw_bytes<char>(104) << '\n'; 
} 

Пример C Код:

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 

#define INT_BITS (sizeof(int) * CHAR_BIT) 

void get_int_raw_bytes(int in, char* out) { 
    for (unsigned long i = 0 ; i < INT_BITS ; i++) { 
    out[INT_BITS - i - 1] = ((in >> i) & 1) ? '1' : '0'; 
    } 
} 

void get_char_raw_bytes(char in, char* out) { 
    for (unsigned long i = 0 ; i < CHAR_BIT ; i++) { 
    out[CHAR_BIT - i - 1] = ((in >> i) & 1) ? '1' : '0'; 
    } 
} 

int main() { 
    puts("Integers:"); 
    for (int i = -5 ; i < 6 ; i++) { 
    char buffer[INT_BITS + 1]; 
    buffer[INT_BITS] = '\0'; 
    get_int_raw_bytes(i, buffer); 
    printf("%4.d %s\n", i, buffer); 
    } 
    puts("Character:"); 
    char buffer[CHAR_BIT + 1]; 
    buffer[CHAR_BIT] = '\0'; 
    get_char_raw_bytes(104, buffer); 
    printf("%4.c %s\n", 104, buffer); 
} 

С Пример вывода:

Integers: 
    -5 11111111111111111111111111111011 
    -4 11111111111111111111111111111100 
    -3 11111111111111111111111111111101 
    -2 11111111111111111111111111111110 
    -1 11111111111111111111111111111111 
    0 00000000000000000000000000000000 
    1 00000000000000000000000000000001 
    2 00000000000000000000000000000010 
    3 00000000000000000000000000000011 
    4 00000000000000000000000000000100 
    5 00000000000000000000000000000101 
Character: 
    h 01101000 
+1

AGH! Я думал, что у меня есть фильтр C++! В любом случае, суть вопроса _is_ language agnostic ... :(Может быть, я исправлю это, чтобы быть C. – druckermanly

+0

@RadLexus Спасибо за головы.Я (почти) достиг паритета между ними. По крайней мере, достаточно, чтобы я доволен результатами. :) – druckermanly