34882


2の補数形式において、アンダーフローなしに10010110から引くことのできる最大の値を10進表記で答えなさい  
どうすればいいでしょうか？ 2の補数形で11101001 正しいですか？  
またアンダーフローとオーバーフロー符号付き符号なしにどう違いますか


CC BY-SA 3.0
2017-05-21T02:17:16.813
34881
2017-05-21T03:12:01.897
23263
question
c
2の補数アンダーフローなし最大値


８ビットの２の補数だとして、  
10010110は、１０進で－１０６(反転して01101001 １を足す01101010 = 0x6A = 16*6 + 10 = 106
に符号を付けて-106)で  
８ビットの２の補数で表現できる一番小さい数が-128 なので、(-106 - 22 = -128)  
１０進で２２です。

Ｃでの問題ではないように思いますが、  
Ｃ（gcc）で検証プログラムを書くと、

[code]

    #include <stdio.h>
    
    int main(void) {
        signed char v = 0b10010110, min = 0b10000000;
    
        printf("%d %d %d\n", v, min, min - v);
    }
    
[/code]

[結果](http://ideone.com/YPvmdU)：`-106 -128 -22`

* * *

８ビットの２の補数形式で表現できる数は  
－１２８～１２７です。  
アンダーフローとは演算の結果が－１２８未満になって(－１２８～１２７の範囲で)表現ができなくなることで、  
オーバーフローとは演算の結果が１２８以上になって表現ができなくなることです。

８ビット符号無しの数の場合表現できる数の範囲は  
０～２５５です。

* * *

別の検証プログラム

[code]

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include <inttypes.h>
    
    int main(void) {
        int8_t v = strtol("10010110", NULL, 2);
        int8_t i;
        for(i = 1; INT8_MIN + i < v; ++i)
            ;
        printf("Ans.%" PRId8 "\n", i);
    }
    
[/code]

[結果](http://ideone.com/X6kG22)：`Ans.22`

* * *

２進数演算で

[code]

     10000000
    -10010110  
    
[/code]

足し算にする。

[code]

     10000000
    +01101010
    ---------
     11101010
    
[/code]

反転して  
`00010101`  
＋１する  
`00010110`  
２２（１６＋４＋２）


CC BY-SA 3.0
2017-05-21T02:43:55.717
34882
2017-05-21T03:12:01.897
2017-05-21T03:12:01.897
5044
5044
34881
answer