簡體   English   中英

a + b和char類型的值

[英]Value of a+b and char type

我在C ++中工作,並且(作為練習)不得不在紙上寫下2個答案。 第一個問題:我們是否具有以下變量的聲明和初始化:

unsigned char x=250, z=x+7, a='8';

表達式的價值是什么?

z|(a-'0') // (here | is bitwise disjunction)

我們具有未簽名的char,因此將z=x+7的數字減少為256,因此,在以二進制形式寫入數字之后,答案為9。


下一個問題:a和b是int變量, a=1b=32767

int的范圍是[-32768, 32767] 我們這里沒有未簽名的類型。 我的問題是: a+b的值是多少? 如果某個變量的值大於該數據類型的范圍,則如何處理帶符號的數據類型?

下一個問題:a和b是int變量, a=1b=32767

[...]我的問題是: a+b的值是多少?

不確定的行為 我們無法告訴您它將是什么。 我們可以做出合理的猜測,但是就C ++而言,有符號整數溢出是未定義的行為。

C ++中沒有operator+(unsigned char, unsigned char) ,它首先將這些unsigned char參數提升為int ,然后再進行加法運算,因此表達式的類型為int

然后將該int以適應其值太大, unsigned char被轉換為unsigned char

該標准說:

整數類型的prvalue可以轉換為另一種整數類型的prvalue。 可以將無作用域枚舉類型的prvalue轉換為整數類型的prvalue。 如果目標類型是無符號的,則結果值是與源整數一致的最小無符號整數(取模2 ** n,其中n是用於表示無符號類型的位數)。 [注意:在二進制補碼表示中,此轉換是概念性的,並且位模式沒有任何變化(如果沒有截斷)。 —尾注]

對於第二個問題,答案是不確定的。

您可以這樣驗證自己:

#include <iostream>

using namespace std;

int main()
{
    int a = 1;
    int b = 32767;
    int c = a+b;
    cout << c << endl;
}

結果將取決於您的計算機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM