Из int в четыре байта покрасивее

enochka1145

Что-то я устал тупить над одной банальностью. Всего надо-то, узнать, как процессор себя величает. Это можно узнать так (VS2003):
#include <iostream>
using namespace std;
void p(int i) {
cout << char(i) << char(i >> 8) << char(i >> 16) << char(i >> 24);
}
int main
{
int a, b, c, d;
for (int i = 0x80000002; i <= 0x80000004; i++) {
__asm {
mov eax, i
cpuid
mov a, eax
mov b, ebx
mov c, ecx
mov d, edx
}
p(a);
p(b);
p(c);
p(d);
}
}
Задачка: как написать то же самое попроще и покрасивше? Устроим конкурс?
Интересует исключительно работающий код. Если кто-то хочет только сказануть "юзай union" или "касты рулят", сразу свободен.

Dmitriy82

Юзай массив

#include <iostream>
int main {
for (int i = 0x80000002; i <= 0x80000004; i++) {
char s[17]={0};
__asm {
mov eax, i
cpuid
mov DWORD PTR s, eax
mov DWORD PTR s+4, ebx
mov DWORD PTR s+8, ecx
mov DWORD PTR s+12, edx
}
std::cout<<s;
}
}

Интересно, это провокационный пост? Ты вроде в холиварах участвовал?

yolki

Можно вопрос на засыпку?
Что означает

char s[17]={0};

?

enochka1145

Круто! Просто как всё гениальное! Спасибо!
Интересно, это провокационный пост? Ты вроде в холиварах участвовал?

Нет, не провокационный.
Ну да, да, участвовал. Подмывает иногда открыть кому-нибудь глаза на то, как всё просто на самом деле, или поставить какого-нибудь сноба на место.

enochka1145

Слово Б. Эккелю (Thinking in C++, Volume 1, Chapter 6: Initialization and Cleanup):
Here, the compiler will use the first initializer for the first array element, and then use zero for all the elements without initializers. Notice this initialization behavior doesn’t occur if you define an array without a list of initializers. So the expression above is a succinct way to initialize an array to zero, without using a for loop, and without any possibility of an off-by-one error (Depending on the compiler, it may also be more efficient than the for loop.)

Dmitriy82

Это означает, что надо забить массив нулями (если стоит инициализатор недостаточной длины, всё остальное заполняется 0). А требуется на самом деле только s[16]=0.

enochka1145

Поищи сам. Тебе все карты в руки уже дали. Если я буду искать, то просто буду делать за тебя твою работу (искать стандарт, искать в стандарте про это).

kamputer

Я ужасТно тупой, но чем в данном случае использование массива лучше юниона или реинтерпрет-каста?

okunek

>Если я буду искать, то просто буду делать за тебя твою работу
если мы будем искать решение твоей проблемы, то просто будем делать за тебя твою работу
Оставить комментарий
Имя или ник:
Комментарий: